String字符串存入数据库中超出最大长度(oracle varchar2 4000)?应合理分条存储(java实现-工具/方法)
问题描述
需要向数据库中保存数据,但某个字段内容长度过长(有中文、符号、英文),应该根据字符串内容与数据库存储上限合理设置储存方式。
解决思路
分条存储,即多条数据前n个字段一致,最后内容字段不同,下方代码可高效利用数据库空间!
代码如下
public class StringSavingUtils {
/**
* 根据参数length,将String类型对象,进行截取
* 用于将长字符串,存入数据库中
* 避免过长 数据库保存失败
* 避免直接写死长度 产生不必要数据
* 前提:一个汉字 占3个字节
* 一个英文 占1个字节
* @param content 需要截取的字符串
* @param lengthMax 数据库中存储的最大长度
* @param lengthCN 汉字占的字节数
* @return List<String>
*/
public static List<String> getList(String content,int lengthMax,int lengthCN) {
List<String> resultList = new ArrayList<>();
if (StringUtils.isEmpty(content) || lengthMax <= 0 || lengthCN <= 0 || (lengthMax <=lengthCN)) {
throw new RuntimeException("参数非法");
}
try {
while(true) {
//最好情况:content即使都是中文,也 <= lengthMax
if (content.length() <= lengthMax / lengthCN) {
resultList.add(content);
break;
}
//有超长的可能
else {
int lenStart = 0;
//截取到lengthMax / lengthCN,计算总长度
for (int i = 0; i < lengthMax / lengthCN; i++) {
//获取每个c的长度+++
String c = content.substring(i,i+1);
lenStart += c.getBytes("UTF-8").length;
}
StringBuilder builder = new StringBuilder(content.substring(0, (lengthMax / lengthCN)));
//循环:当达到最大能储存的最大值 或者 剩下的content取完
int i = lengthMax / lengthCN;
while (lenStart <= lengthMax && i < content.length()) {
String c = content.substring(i,i+1);
lenStart += c.getBytes("UTF-8").length;
builder.append(c);
i++;
}
//应清楚:当因为达到上限跳出循环时,while循环中的所有操作都是多余的
// 包括:i++ -> bug01
// 包括:builder最后一次append -> bug02
//为何退出循环?
// 1:加到content结束,没有达到lengthMax->直接add到resultList
// 2:达到了上限->content被赋值成后半段
if (lenStart <= lengthMax) {
resultList.add(content);
break;
}else {
//bug01
content = content.substring(i-1);
String line = builder.toString();
//bug02
resultList.add(line.substring(0,line.length()-1));
}
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return resultList;
}
}
最后
根据方法返回的list,list.forEach(),循环构造实体+调用save方法!
String字符串存入数据库中超出最大长度(oracle varchar2 4000)?应合理分条存储(java实现-工具/方法)的更多相关文章
- 基于easyui框架中input 类型的checkbox拼接成字符串存入数据库和读取选中---善良公社项目
项目中我做修改用户个人资料的时候,有一个需求是帮助人员的帮助类型如图下所示: 当初想如果是asp.net控件的话应该很简单实现,如果不是基于easyUI框架那就太简单了,现在是受框架的限制与是前端ht ...
- Day_09【常用API】扩展案例1_程序中使用一个长度为3的对象数组,存储用户的登录名和密码……
需求说明:实现用户注册.登陆功能: 1.程序中使用一个长度为3的**对象数组**,存储用户的登录名和密码: 例如如下格式: 登录名 密码 生日 爱好 zhangsan 1111 1998-03-15 ...
- System.Data.DbType的字符串和数据库中字符串类型对应关系
前两天项目中因为历史原因数据库中的一个字段是varchar类型,在做SQL参数化处理时候默认都是DbType.String, 免得查询出现数据转换,于是做类型一致,搜了下对应关系还没找到,只好自己打开 ...
- PHP 读取XML大文件格式并将其存入数据库中
<?php $xml = new XMLReader(); $xmlfile="./full_database.xml";#文件路径 $xml->open( ...
- 数据库中char、varchar、varchar2、nvarchar之间的关系
符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时 ...
- mysql数据库中数据类型的长度
在mysql中新建数据表的时候会有长度一说,其实用建表语句建数据表的时候也有涉及 例如: CREATE TABLE user( uid int(4), name varchar(255), passw ...
- php 遍历文件夹及文件,获取文件名和文件路径存入数据库中
<?php header("Content-Type:text/html; charset=gbk"); require('../../include/connect.php ...
- mysql的text字段长度?mysql数据库中text字段长度不够的问题
类型是可变长度的字符串,最多65535个字符: 可以把字段类型改成MEDIUMTEXT(最多存放16777215个字符)或者LONGTEXT(最多存放4294967295个字符). MySQL ...
- 读取txt数据存入数据库中
http://blog.csdn.net/daditao/article/details/18899469
随机推荐
- yii2之创建管理员
第一步,使用迁移文件建表admin 先建立数据迁移文件: 小贴士,如果发现自己改错了,需要重新修改迁移文件 第二步,使用gii工具创建model 创建一个新的model,继承AdminAR,方便以后管 ...
- FAFU 1395
动态规划:...翻牌FAFU 1395 动态规划
- ASP.NET控件--DropDownList
设置默认值:DropDownList1.Items[i].Selected=true;绑定:DropDownList1.DataSource = dataSet.Tables["Tabl ...
- HTTP 协议入门
本文转载自:http://www.ruanyifeng.com/blog/2016/08/http.html HTTP 协议是互联网的基础协议,也是网页开发的必备知识,最新版本 HTTP/2 更是让它 ...
- yum安装时提示app is currently holding the yum lock; waiting for it to exit
yum安装时出现下面情况 可能是yum升级一些文件时,出现这种情况 解决方法: #rm -f /var/run/yum.pid 强制关掉yun进程
- 【翻唱】【你的名字MAD】爱你等于爱自己
http://video.yingtu.co/0/8f606e9b-9694-4d35-a0bf-730391a3ee12.mp4 [你的名字MAD]爱你等于爱自己-原唱翻唱 http://video ...
- 一个简单的JavaScript实例
1 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...
- RabbitMQ详解(一)------简介与安装(Docker)
RABBITMQ详解(一)------简介与安装(DOCKER) 刚刚进入实习,在学习过程中没有接触过MQ,RabbitMQ 这个消息中间件,正好公司最近的项目中有用到,学习了解一下. 首先什么是MQ ...
- 02: 安装epel 解决centos7无法使用yum安装nginx
参考网址: http://www.mamicode.com/info-detail-1671603.html 1.yum命令安装 yum install epel-release -y 2.更新数据 ...
- 对于“机器视觉(computer version)”的反思
做图像有一段时间了,几个问题进行反思,欢迎讨论 1.机器视觉的本质是什么? 我认为就是通过计算机和数学的方法,对一定形式存储的2d或3d的视觉信号进行增强.延伸,以增加信号的强度: 2.机器视觉的第一 ...