MySQL数据库字段超长问题的解决

 更新时间:2023年07月29日 14:55:09   作者:adrninistrat0r  
这篇文章主要介绍了MySQL数据库字段超长问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

存在的问题

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

  • 处理上游系统发送的交易信息,将多个字段拼成一个JSON或其他格式的字符串;在增加字段,或数据较长时,写入或更新数据库时可能超长;
  • 调用下游系统的服务,返回的部分字段(如错误信息等)较长时,导致更新数据库记录失败。

问题解决与优化建议

1. JSON等格式的字段

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

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

1.1. MySQL字符串字段长度

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

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

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

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

类型最大长度单位
CHAR(n)255字符数
VARCHAR(n)65535字符数
TINYTEXT255字节数
TEXT65535字节数
MEDIUMTEXT16777215字节数
LONGTEXT4294967295字节数

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

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

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. 可以截断的字段

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

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已产生死锁的解决方法及永久避免方案

    MySQL已产生死锁的解决方法及永久避免方案

    这段文章介绍了MySQL死锁的处理与预防策略,涵盖了自动自动处理、查看死锁日志、临时应急措施以及永久避免死锁的方法,通过优化事务逻辑、固定访问顺序和加索索引等措施,可以有效减少死锁的发生,需要的朋友可以参考下
    2026-06-06
  • 分享MySQL的自动化安装部署的方法

    分享MySQL的自动化安装部署的方法

    线上的MySQL一般都采用源码编译,虽然MySQL的源码编译挺简单的,但是试想一下,如果你有几百台服务器同时要安装MySQL,难道你还一台台去手动编译、编写配置文件吗?这显然太低效了,本文讨论MySQL的自动化安装部署。
    2014-07-07
  • mysql搭建主从复制的实现步骤

    mysql搭建主从复制的实现步骤

    在MySQL集群中,主库更新会同步到从库,但从库更新不同步到主库,主从复制能分摊压力,本文就来介绍一下mysql搭建主从复制的实现步骤,感兴趣的可以了解一下
    2024-11-11
  • MySQL索引失效的几种常见场景详解

    MySQL索引失效的几种常见场景详解

    索引失效指的是在进行查询操作时,本应该使用索引来提升查询效率的场景下,数据库没有利用索引,而是采用了全表扫描的方式,这会大大增加查询时间和系统负担,这篇文章主要介绍了MySQL索引失效的几种常见场景的相关资料,需要的朋友可以参考下
    2025-09-09
  • 五分钟带你搞懂MySQL索引下推

    五分钟带你搞懂MySQL索引下推

    这篇文章主要介绍了Mysql的索引下推,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-09-09
  • MySQL按指定字符合并以及拆分实例教程

    MySQL按指定字符合并以及拆分实例教程

    这篇文章主要给大家介绍了关于MySQL按指定字符合并以及拆分的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06
  • MySQL运行在docker容器性能损失解析

    MySQL运行在docker容器性能损失解析

    这篇文章主要为大家介绍了MySQL运行在docker容器中的性能损失解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 查询数据库空间(mysql和oracle)

    查询数据库空间(mysql和oracle)

    本文通过代码示例详细介绍了如何查询MySQL数据空间和Oracle数据空间,具有一定的参考价值,感兴趣的小伙伴可以参考阅读
    2023-04-04
  • mysqldump加-w参数备份数据时需要注意的事项

    mysqldump加-w参数备份数据时需要注意的事项

    这篇文章主要介绍了mysqldump加-w参数备份数据时需要注意的事项,需要的朋友可以参考下
    2014-06-06
  • Mysql5.6 忘记root密码的解决办法

    Mysql5.6 忘记root密码的解决办法

    mysql5.6忘记root密码怎么办,用什么方法可以重置root密码呢?下面通过本文给大家介绍Mysql5.6 忘记root密码的解决办法,需要的朋友参考下
    2016-01-01

最新评论