MySQL数据库字段超长问题

MySQL 表字段太多超长问题及解决方案 在 MySQL 中,表字段超长问题通常是由于字段数量过多或字段定义过长引起的。在设计数据库时,了解 MySQL 对于字段数量和行大小的限制是至关重要的。通过合理设计字段类型、拆分表结构、使用合适的数据存储方式,可以有效解决字段超长问题,确保数据库的性能和可维护性。最佳实践合理定义字段类型,避免使用过于冗长的字段定义。拆分过于复杂的表,减少单表的字段数量。使用JSON或XML字段存储动态数据。归档历史数据,减少主表的数据量。通过这些优化措施,可以避免表字段过长的问题,并提升数据库系统的整体性能。 阅读详情
AI摘要

本文探讨了在MySQL中遇到字段超长的问题,特别是在处理JSON数据和长文本时。建议避免将重要字段以JSON格式存储,并关注字符串类型的字段长度限制。对于超过768字节的字段,存储和查询效率会降低。解决方案包括合理设计数据库结构,使用适当的字符串类型,以及在必要时对数据进行截断。此外,还提到了在Java中进行字符串截取时的注意事项,确保与MySQL的VARCHAR类型长度一致。

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字符数
TINYTEXT255字节数
TEXT65535字节数
MEDIUMTEXT16777215字节数
LONGTEXT4294967295字节数

需要注意,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数据库字段超长问题的终极指南:一劳永逸的七个解决方案! 但请务必注意,修改字段长度可能会影响现有数据的完整性,因此在执行此操作之前,请备份数据并确保执行充分的测试。根据具体情况选择最合适的解决方案,并在执行任何修改之前充分测试和备份数据,以确保数据的完整性和系统的稳定性。某些字符集,如UTF-8,需要更多的存储空间来表示字符。6、使用外部存储: 如果你的数据太大而无法适应MySQL的字段长度限制,可以考虑使用外部存储解决方案,如文件系统或分布式存储系统。这些类型可以容纳更大的数据量,但需要注意的是,使用BLOB或TEXT类型可能会影响查询和索引的性能。 阅读详情

相关推荐

debian mirrors 镜像源 riscv 64 赛昉 星光 starfive vf2 InRelease‘ doesn‘t support architecture ‘riscv64‘

debian mirrors 镜像 riscv 64 赛昉 星光2 starfive vf2 InRelease' doesn't support architecture 'riscv64'

qq_29758759的博客 1259

前端传输字段长度超过数据库中定义字段长度

前端传输字段长度超过数据库中定义字段长度 最近在生产环境中出现一个问题,定位了一夜最终得以解决 总结起来就是,前端传输字段过长,造成在插入数据中的时候出现错误 这个错误并没有报sql异常,并且在前端显示的空指针异常,在dev或者sit的时候这个问题并没有再次出现 这个问题比较难以解决的是:并没有报错日志,自测并没有出错,很难定位 最后发现是因为前端传输字段长度过长,数据库中字段最长1000,但是用户在传输的时候超过了1000,前端没有校验住,把数据放到了后端,造成错误 建议 一定要尽可能的自测,自测的

IT枫斗者的博客 3499

GD32F303 ADC+DMA实战:用硬件过采样搞定多通道数据采集(附完整代码)

本文详细介绍了GD32F303系列MCU通过ADC+DMA结合硬件过采样技术实现多通道数据采集的实战方案。从硬件设计要点到软件配置全解析,包括时钟树配置、ADC模块初始化和DMA传输设置,提供了完整的代码示例和优化技巧,帮助工程师构建高精度、低功耗的数据采集系统。

weixin_30466039的博客 319

字段太长,无法录入数据库

报错: 2017-03-13 10:16:43,159 ERROR [org.hibernate.util.JDBCExceptionReporter] - Data truncation: Data too long for column 'value' at row 1 2017-03-13 10:16:43,167 ERROR [org.hibernate.event.def.Abstra...

山重水复疑无路 6604

WRF-BEM相关参数说明

本参数适用于WRF-BEM模拟武汉市气候。

m0_60013472的博客 1896

电流镜结构实战:从零理解MOS管偏置电路设计(附吴金课程补充)

本文深入解析电流镜结构在MOS管偏置电路设计中的关键作用,从基本原理到实战应用全面覆盖。通过分析偏置电路的核心原理、破解设计难题的实用技巧,以及进阶优化策略,帮助工程师掌握这一模拟电路设计的核心技术。特别适合需要理解电流镜结构和基准电路设计的读者参考学习。

ujm5678901的博客 256

mysql 查询的字段值太长显示不全 group_concat

【代码】mysql 查询的字段值太长显示不全 group_concat。

xnian_的博客 1333

AI故障预测系统架构设计:5个核心模块+3种主流架构,收藏这篇就够了

深夜11点,某汽车工厂的生产线突然停机——核心机器人的轴承磨损过度导致卡壳。维修人员连夜抢修,直接损失超过50万元,还延误了客户的交货期。传统的“事后维修”或“定期维护”要么代价高昂,要么防不胜防。AI故障预测系统的出现,让“精准维护”成为可能——它能通过传感器数据提前7-30天预警故障,将停机损失降低80%以上。知道要做故障预测,却不知道怎么搭系统——数据怎么采集?特征怎么提取?模型怎么部署?架构怎么选?本文将解决这些问题:我们会拆解AI故障预测系统的5个核心模块,分析3种主流架构。

AIGC应用创新大全的博客 1020

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

把 字段类型 改为longtext 即可,因为: 1、text字段类型:text字段类型的字节限制为65535字节。 2、longtext字段类型:longtext字段类型的字节限制为2147483647字节。 可见,longtext字段类型的最大长度 为text字段类型 的 3万多倍,longtext字段最大可存约 3G 的内容 ...

dd2016124的博客 8581

2023华为OD机试真题B卷 Python 实现【最长的元音子串长度】

定义当一个字符串只有元音字母(a,e,i,o,u,A,E,I,O,U)组成,称为元音字符串,现给定一个字符串,请找出其中最长的元音字符串,并返回其长度,如果找不到请返回0, 字符串中任意一个连续字符组成的子序列称为该字符串的子串

MISAYAONE的博客 902

前端使用二开Thingsboard一、二、三事(三)-规则链

以项目实战为基础,逐步介绍前端在thingsboard系统二次开发中的一些注意事项以及一些thingsboard一些页面功能讲解,为前端人员开发使用thingsboard提供一种可靠思路,打造一个完美的物联网系统。

weixin_43163457的博客 863

java连接mysql查询字段超长_web开发中,巧妙解决数据库字段过多的问题:Java位操作...

在web开发过程中,我们大多都会碰到类似这样一个问题:(p2p)一个【标的】中,是否新手标,是否加息标,是否逻辑删除 等等,一般开发者会给定3个字段分别存储,但是当以后业务扩展了 是否满标,是否生成回款表... 这就无止境了。其实,我们仔细分析不难发现:是否新手标/加息标/逻辑删除 这些维度的值都是一样的:要么是,要么不是。这与计算机世界的 0/1 非常吻合,今天也是以 0/1为切入点来解决此类问...

weixin_39908616的博客 581

am62x A53与R5F通信

AM62x是Ti的一款异构多核芯片。remoteproc驱动,硬编码(写死)了R5F/M4F固件的名字,这样驱动启动时,就会找硬件编码的固件,下面是其对应关系。值得注意的是,linux内核中的M4F remoteproc驱动启动M4F,而linux内核中的R5F remoreteproc驱动不启动R5F,相反,它attach到已经在boot阶段启动的R5F固件上。在/lib/firmware的真实固件名:,而我们生成的固件名如下所示,没有直接对应的,经确认,.out文件就是我们需要的,重命名后即可。

鹰之翔 1362

眼见不一定为实之MySQL中的不可见字符

在开始今天的博客内容之前,正在看博客的您先来看看以下这两条sql,如果您刚好还有MySQL的环境。不妨先猜测一下它输出的内容,然后看看是否有什么区别?各位不妨猜测一下,上面两条sql语句的执行结果l1和l2分别是多少?是不是在你的预料之中。这里不卖关子了,相信执行过sql的朋友一定看到了结果。没有数据库客户端的朋友来看我的执行结果。在给出结果之前,首先把基础环境介绍一下。

m0_74823317的博客 839

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Mysql中的字段长度超长不报错,反而自动截取长度问题

Mysql中的字段长度超长不报错,反而自动截取长度问题解决 问题原因:mysql没有开启严格模式 检查my.ini发现sql-mode="" sql-mode="" 将其改为 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 再执行sql发现可以正常报:SQLSTATE[22001]: String data, right truncated: 1406 Data too long for co

iO747254055的博客 4275

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Mysql 字段长度过长自动截断的机制

mysql在配置文件my.cnf中有一个配置项 [mysqld] sql-mode = "xx_mode"sql-mode中有STRICT_TRANS_TABLES是在数据超长的情况下会插入失败,当删除这个限制时,插入超长会MySQL会自动截断超长的字段 如果无法修改服务端的配置那么在sqlsession中设置sql-mode 也可以达到改变长度约束的目的 如: select @@session.sql_mode; set @@global.sql_mode='ONLY_FULL_GROUP_B.

aa1382525的专栏 7163

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

达梦数据库insert出现“记录超长”

将mysql迁移到达梦时,出现创建表失败,一般都是转换的时候字段长度不一致,导致创建表失败。所以手动拷贝mysql到达梦执行的时候报这个错 达梦默认初始化数据库的时候页大小是不超过8000个字符,也就是一行不超过这个数据,因为我这个表有几个varchar(2000)所以就超过了。 解决方法 create table t2(id int)storage(using long row);建表属性...

Wang__dream的博客 1万+

mysql迁移到达梦数据库报错:参数不兼容

2: 如果还报错,指定和mysql同版本驱动。

weixin_45699851的博客 1063

mysql数据库迁移到达梦8时遇到的问题记录

达梦,mysql,迁移问题

qq_44776593的博客 1684

达梦数据库DM8-mysql迁移后字符串长度问题

公司新项目政企单位平台开发,由于甲方要求信创,导致不得不做数据库的切换。我们选用的的达梦数据库(),一家国产十几年的上市企业所打造的数据库。达梦数据库在初始化数据库时候有两个参数。:也是存放可变长度的字符串,最大长度是。参考自己的编码类型去具体的设置字段长度。长度发现和同步过来的一致的,数据在。存放可变长度的字符串,最大长度是。可以入库 在dm8就不能存入。字段超长的情况,检查了。所占长度是有所差异的。数据到达梦时候,出现。0代表gb18030。

小码农吗 3255

MySQL报错SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Syb

项目运行了几个小时后自动断开连接 , 服务器报以下错误 : Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml] SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-S...

HoraceEz的博客 1283

data too long for column mysql_mysql Data too long for column问题

整合spring,struts,ext做一个系统,连接的是mysql数据库,插入数据时,控制台报:com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'user_name' at row 1错误,具体信息如下:严重: Servlet.service() for servlet default t...

weixin_32563411的博客 459

Wagtail 2.12.6 发布解析:修复 embed thumbnail_url 迁移在超长 URL 上的失败问题

> Wagtail 2.12.6 是 2021 年 7 月 13 日发布的一次维护性补丁(patch)版本,整个版本仅包含一项 bug 修复:**防止 embed(嵌入内容)模块的 `thumbnail_url` 字段迁移在 URL 超过 200 个字符时执行失败**。本文以该发布说明为骨架,结合当前仓库中 `wagtail/embeds` 模块的迁移文件、模型定义、运行时逻辑与测试代码,还原这次

gitblog_00254的博客 119

mysql 创建表遇到单列的长度限制 ERROR 1074 (42000) 与 行长限制 ERROR 1118 (42000)

os: centos 7.4 db: mysql 8.0.18 ERROR 1074 (42000): Column length too big for column ‘c0’ (max = 16383); use BLOB or TEXT instead ERROR 1118 (42000): Row size too large. The maximum row size for the u...

一名数据库爱好者的专栏 3770

Mysql注入

0x01 False Injection username=0时数据库会返回数据,尝试一下使password=0会不会返回同样的数据。 空集无法查询 MYSQL的隐式类型转换。 如果两个参数比较,有至少一个NULL,结果就是NULL,除了是用NULL<=>NULL 会返回1。不做类型转换 两个参数都是字符串,按照字符串比较。不做类型转换 两个参数都是整数,按照整数比...

weixin_30299709的博客 115
上一篇: MySQL二级索引中的主键——MySQL存在大量相同数据分页查询优化
下一篇: MySQL SQL语句与事务执行及日志分析
adrninistrat0r
博客等级 码龄18年 395粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值