问题描述

需要向数据库中保存数据,但某个字段内容长度过长(有中文、符号、英文),应该根据字符串内容与数据库存储上限合理设置储存方式。

解决思路

分条存储,即多条数据前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实现-工具/方法)的更多相关文章

  1. 基于easyui框架中input 类型的checkbox拼接成字符串存入数据库和读取选中---善良公社项目

    项目中我做修改用户个人资料的时候,有一个需求是帮助人员的帮助类型如图下所示: 当初想如果是asp.net控件的话应该很简单实现,如果不是基于easyUI框架那就太简单了,现在是受框架的限制与是前端ht ...

  2. Day_09【常用API】扩展案例1_程序中使用一个长度为3的对象数组,存储用户的登录名和密码……

    需求说明:实现用户注册.登陆功能: 1.程序中使用一个长度为3的**对象数组**,存储用户的登录名和密码: 例如如下格式: 登录名 密码 生日 爱好 zhangsan 1111 1998-03-15 ...

  3. System.Data.DbType的字符串和数据库中字符串类型对应关系

    前两天项目中因为历史原因数据库中的一个字段是varchar类型,在做SQL参数化处理时候默认都是DbType.String, 免得查询出现数据转换,于是做类型一致,搜了下对应关系还没找到,只好自己打开 ...

  4. PHP 读取XML大文件格式并将其存入数据库中

    <?php     $xml = new XMLReader(); $xmlfile="./full_database.xml";#文件路径   $xml->open( ...

  5. 数据库中char、varchar、varchar2、nvarchar之间的关系

    符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时 ...

  6. mysql数据库中数据类型的长度

    在mysql中新建数据表的时候会有长度一说,其实用建表语句建数据表的时候也有涉及 例如: CREATE TABLE user( uid int(4), name varchar(255), passw ...

  7. php 遍历文件夹及文件,获取文件名和文件路径存入数据库中

    <?php header("Content-Type:text/html; charset=gbk"); require('../../include/connect.php ...

  8. mysql的text字段长度?mysql数据库中text字段长度不够的问题

    类型是可变长度的字符串,最多65535个字符:     可以把字段类型改成MEDIUMTEXT(最多存放16777215个字符)或者LONGTEXT(最多存放4294967295个字符). MySQL ...

  9. 读取txt数据存入数据库中

    http://blog.csdn.net/daditao/article/details/18899469

随机推荐

  1. transform 和 transition

    transform的属性包括:rotate() / skew() / scale() / translate() /matrix() 其中 rotate() 旋转度数,0-360 skew()  元素 ...

  2. MySQL从删库到跑路(六)——SQL插入、更新、删除操作

    作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.插入数据 1.为表的所有字段插入数据 使用基本的INSERT语句插入数据要求指定表名称和插入到新记录的值. IN ...

  3. Linux其他:环境变量配置

    计算机==>右键==>属性==>高级系统设置==>环境变量==> 系统变量path后面+';python路径名

  4. 20165207 Exp1 PC平台逆向破解

    20165207 Exp1 PC平台逆向破解 0.写在最前面 在做三个实验的前两个的时候,我还没有到博客里去看作业的要求.当时我的主机名是kali5207也就是用我的学号命名的,要求的是姓名全拼命名k ...

  5. QtQuickcontrols2控件使用参考

    随着Qt的版本升级,其自带的controls控件库也不断升级,目前已经到了2.3的版本.本文通过解读Qt自带的gallery例程,说明新版本controls控件库的相关特性.其具体位置于: 因为相关的 ...

  6. 20145317彭垚《网络对抗》Exp7 网络欺诈技术防范

    20145317彭垚<网络对抗>Exp7 网络欺诈技术防范 基础问题回答 通常在什么场景下容易受到DNS spoof攻击? 在同一局域网下比较容易受到DNS spoof攻击,攻击者可以冒充 ...

  7. #if 1...#endif

    1. “#if 0/#if 1 ... #endif”的作用,我们知道,C标准不提供C++里的“//”这样的单行风格注释而只提供“/* */”这样的块注释功能,我们通常使用它写代码中说明性的注释文字( ...

  8. Python3基础 list 使用for循环 删除列表中的重复项

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. 【转载】浅谈JavaScript,let和var定义变量的区别

    了解JS与ES5与ES6区别 JS语言 JavaScript一种动态类型.弱类型.基于原型的客户端脚本语言,用来给HTML网页增加动态功能. 动态: 在运行时确定数据类型.变量使用之前不需要类型声明, ...

  10. Python数据分析入门之pandas基础总结

    Pandas--"大熊猫"基础 Series Series: pandas的长枪(数据表中的一列或一行,观测向量,一维数组...) Series1 = pd.Series(np.r ...