1. 存在的问题

在向MySQL数据库表中插入或更新记录时,有时会出现字段超长的问题,包括但不限于以下场景:

  • 处理上游系统发送的交易信息,将多个字段拼成一个JSON或其他格式的字符串;在增加字段,或数据较长时,写入或更新数据库时可能超长;

  • 调用下游系统的服务,返回的部分字段(如错误信息等)较长时,导致更新数据库记录失败。

2. 问题解决与优化建议

2.1. JSON等格式的字段

有业务含义的重要字段,不建议通过JSON字符串格式保存在一个数据库字段中。

假如需要将字段以JSON字符串格式保存在一个数据库字段中,建议只保存相对不重要,且不需要作为唯一的查询条件的字段,在进行保存时也需要考虑字段超长问题,及新旧数据与新旧代码相互之间的兼容问题。

2.1.1. MySQL字符串字段长度

半角英文字母、数字、符号等常见字符,1个字符占用1个字节;1个汉字字符占用3个字节。

在utf8字符集下,1个字符最多占用3个字节,不支持占用4个字节的字符。

在utf8mb4字符集下,1个字符最多占用4个字节,可以保存emoji表情等占用4个字节的字符。

MySQL字符串字段的最大长度如下所示:

类型 最大长度 单位
CHAR(n) 255 字符数
VARCHAR(n) 65535 字符数
TINYTEXT 255 字节数
TEXT 65535 字节数
MEDIUMTEXT 16777215 字节数
LONGTEXT 4294967295 字节数

需要注意,CHAR、VARCHAR类型字段的最大长度的单位为字符数,能够保存的汉字数量等于最大支持字符数

TEXT等类型字段的最大长度的单位为字节数,能够保存的汉字数量不超过最大支持字节数的1/3

2.1.2. MySQL使用较长的字符串类型字段影响

MySQL、MariaDB较新版本支持JSON类型字段,其他版本需要使用字符串类型字段保存。

MySQL中长度超过768字节的固定长度字段被编码为变长字段,例如VARCHAR(超过768字节)、TEXT等,变长字段被称为页外列(off-page),不是保存在InnoDB的B+树索引中,而是保存在溢出页(overflow page)中。在溢出页中,变长字段的值以单链表形式存储。

对于保存JSON形式的字符串类型字段,由于需要保存较多内容,很可能属于变长字段。保存JSON形式的字符串类型字段不适合在查询时作为唯一的查询条件,原因如下:

  • 保存JSON形式的字符串类型字段不适合创建索引:一是JSON字符串中的字段顺序不固定,通过like进行最左匹配查询,很难从保存JSON形式的字段中查询到需要的数据;二是因为InnoDB索引支持的长度有限(在MySQL InnoDB默认配置下,索引支持的最大长度为768字节);

  • 仅通过变长字段进行查询时,无法通过B+树结构的索引进行查询,而是需要在单链表形式的溢出页中逐条进行查询,查询效率会非常低。

查询变长字段,与不查询变长字段相比,开销会更大,耗时会更长。因为查询变长字段时,会增加从溢出页中查询数据的步骤;且需要返回的数据量可能较大,数据返回耗时会增加。

在查询包含变长字段的数据库表时,假如不需要获取变长字段,则不应该在SQL语句中指定查询变长字段。

2.2. 可以截断的字段

对于截断后不影响使用的字段,在写入或更新数据库时,可对存在超长风险的字段按照数据库字段长度进行截断;

JDK中的String.substring()方法,commons-lang3中的StringUtils.substring()、StringUtils.truncate()方法,参数中的数字单位都是字符数,不是字节数。

在Java中对字符串进行截取时,建议使用StringUtils.truncate()方法。

MySQL中的CHAR、VARCHAR类型的最大长度,也是字符数,不是字节数。

因此在Java中对字符串根据MySQL的字符串类型字段长度进行截取时,两者的长度是一致的。

例如MySQL中的字段为VARCHAR(200),则可使用以下方式进行截取,将截取结果写入数据库。

StringUtils.truncate("xxx", 200);

MySQL数据库字段超长问题相关推荐

  1. 开发技巧-使用SQL与Navicat快速导出一个自定义的MYSQL数据库字段表格(数据字典)为Word或Excel

    1.基于MYSQL快速形成数据字典表格(数据库字段表格元信息)的需求 在书写数据库开发文档或相关文章时,总是可能应用到所设计的数据库元信息,形成一个科学的数据字典表格,相比传统的在Word.Excel ...

  2. MYSQL数据库字段关联_MySQL数据库基础——操作关系表、连接查询

    MySQL数据库基础入门--day11 一.操作关联表 1.关联关系: 关联关系有:多对一.多对多和一对多. 一对一关联关系可以应用在以下几方面: (1)分割具有很多列的表 (2)由于安全原因而隔离表 ...

  3. mysql 数据库字段类型大全

    数值 tinyint 1.十分小的数据,占用1个字节,有符号的范围是-128 - 127,无符号的范围是 从 0 到 255 的整型数据 2.java类型Integer smallint 1.较小的数 ...

  4. mysql数据库字段类型大全_mysql数据库字段类型详解

    MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述. ...

  5. mysql数据库字段默认值设为什么_为什么数据库字段需要设置默认值

    收到一只叮咚 mysql数据库默认对varchar的字段的值不就是空('')么,对数值默认是0,那还需要设置默认值的必要性何在?疑问的原因是没启用MySQL的严格模式(strictmode),很多快捷 ...

  6. mysql数据库字段变形_详解如何利用amoeba(变形虫)实现mysql数据库读写分离

    摘要:这篇MySQL栏目下的"详解如何利用amoeba(变形虫)实现mysql数据库读写分离",介绍的技术点是"MySQL数据库.数据库读写分离.amoeba.MySQL ...

  7. MySQL数据库字段类型 text 超长报错问题解决方案

    把 字段类型 改为 longtext 即可,因为: 1.text字段类型:text字段类型的字节限制为65535字节. 2.longtext字段类型:longtext字段类型的字节限制为2147483 ...

  8. 如何更新mysql数据库字段_如何使用MySQL一个表中的字段更新另一个表中字段

    1,修改1列 update student s, city c set s.city_name = c.name where s.city_code = c.code; 2,修改多个列 update ...

  9. java如何映射mysql枚举_java中自定义枚举enum映射到mysql数据库字段处理器handler

    mybatis中默认的处理枚举类型的handler有 如果要处理一些特殊的情况下字段内容字段的转换,需要自定义处理器,比如如下例子要处理数据库中默认字段值为""空字符串的问题 im ...

最新文章

  1. 使用Node.js快速搭建WebSocket server
  2. 9月份准备备考RHCE 10份考试争取一次通过
  3. C语言ATD1SC,2020-10-13_ATD(模数转换)模块介绍
  4. 《软件工程》实验报告——软件设计
  5. Nacos源码集群一致性
  6. 女人 这20种男人你永远不必等
  7. Typora颠覆写作体验的极简好用 Markdown 编辑器基本设置教程
  8. Android自己动手打造XML解析框架
  9. 用C写邮箱密码暴力破解器
  10. 百度云开发clouda学习(一)
  11. 随机生成20以内加减法,5次答题并统计正确和错误题数
  12. web前端 “我是有底线的”效果
  13. linux系统怎么制作win10,win10 + linux 制作双系统教程(我本身是win10系统)
  14. API-String中的某些方法
  15. 网页计算机谈音乐,如何用windows电脑录制网页上或电脑中自己的音乐
  16. 【故事】程序员到底是干什么的
  17. 爬取QQ音乐中一首歌的相关信息及评论(破解反爬虫、多协程队列爬虫)
  18. 推荐 6 个火爆 GitHub 的开源项目
  19. Python基础语法笔记(十六)文件与文件系统
  20. Java软路由_J4105四口i211 千兆软路由 简单开箱

热门文章

  1. 联想笔记本无法进入BIOS怎么办?
  2. python 九九乘法表 和 两种方法打印闪电标志
  3. 数据库资深“学霸”再启程,专访数据库初创公司矩阵起源全球 CTO 田丰博士
  4. 回归主流:区块链新大门的“密钥”
  5. Babylonjs 最全demo集合 (内附源码)
  6. 【信号与系统】(二十四)z变换与z域分析——z域分析
  7. 文明6游戏 linux,《文明6》正式支持Linux/SteamOS 但不支持Intel核显和A卡
  8. 艾永亮:上半场靠投机,下半场靠努力——最难的2020是最好的起点
  9. Jetson Xavier NX 解码性能评测
  10. 永恒之柱2显示服务器,永恒之柱2游戏黑屏是什么原因怎么解决_画面显示不全解决方法教程攻略...