问题描述

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

解决思路

分条存储,即多条数据前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. python之路----socketserver模块

    socketserver import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): ...

  2. 干货:Java并发编程系列之synchronized(一)

    1. 使用方法 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,同一时刻只有一个方法可以进入到临界区 保 ...

  3. MySQL之表连接(内外连接和重命名的使用)

    #要多练练 1.连接查询根据连接方式分为 内连接 等值连接 非等值连接 自连接 外连接 左外连接(左连接) 右外连接(右连接) 当多张表进行连接查询,若没有任何条件进行限制,会 发生什么现象? 会出现 ...

  4. Python Web学习笔记之TCP/IP、Http、Socket的区别

    经常在笔试.面试或者工作的时候听到这些协议,虽然以前没怎么涉及过,但至少知道这些是和网络编程密不可分的知识,作为一个客户端开发程序员,如果可以懂得网络编程的话,他的作用和能力肯定会提升一个档次.原因很 ...

  5. Python学习笔记之@classmethod与@staticmethod

    Python面向对象编程中,类中定义的方法可以是 @classmethod 装饰的 类方法 ,也可以是 @staticmethod 装饰的 静态方法 ,用的最多的还是不带装饰器的 实例方法 ,如果把这 ...

  6. c++中类似于java jprofiler/eclispe memoryanalysis的性能以及内存分析工具

    visual studio有自带的,可以看MSDN,不过一般来说,我们比较关注linux下的,搜了下,比较好用的应该有gprof和valgrind,先记录,可参考如下: http://blog.csd ...

  7. 20145335郝昊《网络攻防》Exp5 MS08_067漏洞测试

    20145335郝昊<网络攻防>Exp5 MS08_067漏洞测试 实验内容 了解掌握metasploit平台的一些基本操作,能学会利用已知信息完成简单的渗透操作. 漏洞MS08_067: ...

  8. Cron表达式详解和表达式的验证

    本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表达式 这两篇文章. cron校验的 ...

  9. 我们能从 jQuery 的一个正则表达式中学到什么?

    注意,该篇文章当前为粗糙的 v0.9 版本,会在稍后润色更新. 让我们来看一道思考题,根据 rejectExp,分析其正则执行过程中如何进行过滤?包含哪些执行步骤? rejectExp 变量的值如下: ...

  10. Python3基础 os listdir 列举指定的所有文件及文件夹的名字

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