千家信息网

MySQL中需要注意的字段长度问题

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,在MySQL的表结构设计中,突然想起来几个地方碰到的问题比较多,大体来说一个就是字符集,一个就是数据类型。而字符集和数据类型结合起来,就有一个蛮有意思的细节,那就是行长度的问题。比如我们创建一个表使用
千家信息网最后更新 2025年11月08日MySQL中需要注意的字段长度问题

在MySQL的表结构设计中,突然想起来几个地方碰到的问题比较多,大体来说一个就是字符集,一个就是数据类型。

而字符集和数据类型结合起来,就有一个蛮有意思的细节,那就是行长度的问题。

比如我们创建一个表使用了varchar的类型,如果指定为gbk,表里含有一个字段,可以指定为32766字节,如果再长一些就不行了。

其中的计算方式就需要理解了,因为varhcar类型长度大于255,所以需要2个字节存储值的长度,而MySQL里面的页的单位是16k,使用了IOT的方式来存储。所以如果超过了这个长度,那就会有溢出的情况,和Oracle的overflow很类似。

所以对于gbk类型,行长度最大为65535,则varchar列的最大长度算法就是 (65535-2)/2 =32766.5,所以此处就是32766了。

> create table test_char(v varchar(32766)) charset=gbk;
Query OK, 0 rows affected (0.00 sec)
> create table test_char1(v varchar(32767)) charset=gbk;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs而另外一种字符集,也是默认的字符集latin1,有些系统支持火星文的还是会喜欢用这种字符集。

它的长度就不一样了,对应是1字节,所以varchar(32767)是没有任何问题的,而最大长度就是65532了。
> create table test_char1(v varchar(32767)) charset=latin1;
Query OK, 0 rows affected (0.01 sec)
> create table test_char2(v varchar(65535)) charset=latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs而对于utf8还是有很大的差别,对应的是3个字节,所以需要除以3,按照(65535-2)/3,最大值就是21844了。
> create table test_char2(v varchar(21844)) charset=utf8;
Query OK, 0 rows affected (0.00 sec)
> create table test_char3(v varchar(21845)) charset=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs上面的场景相对来说会有一些局限性,那么我们引入表结构的设计。

如果是gbk字符集,含有下面的几个字段,则memo字段的varchar类型最大长度是多少?

> create table test_char3(id int,name varchar(20),memo varchar(32766)) charset=gbk;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

这个问题还是如法炮制,应用之前的计算方式,数值型是4个字节,字符型乘以2,含有字符型的长度小于255,所以减去1即可,这样下来就是(65535-1-4-20*2-2)约等于32743

> create table test_char3(id int,name varchar(20),memo varchar(32744)) charset=gbk;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOB两种测试结果可以简单对比一下。
> create table test_char3(id int,name varchar(20),memo varchar(32743)) charset=gbk;
Query OK, 0 rows affected (0.01 sec)
select (65535-1-4-20*2-2)/2;
+----------------------+
| (65535-1-4-20*2-2)/2 |
+----------------------+
| 32744.0000 |
+----------------------+
1 row in set (0.00 sec)


整个过程还是需要考虑到这些点的,否则前期不够重视,在后面去做扩展的时候就会有很大的限制。

长度 字符 就是 字符集 类型 最大 字节 问题 还是 字段 方式 字符型 很大 数据 结构 面的 存储 设计 不行 如法炮制 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 标准网络技术市场报价 更新数据库时发生错误列名无效 数据库建库建表语句 怎样打搭建中转服务器 郑州网络安全主题 单位内部网络安全保护 下列哪个是软件开发工具 网络安全行业资质申请 软件开发项目财务科目 服务器压缩文件怎么查看内容 软件开发费交增值税税率 合肥最近网络安全事件 云闪付绑卡服务器请求超时 海峡信息_网络安全厂家 网络安全手抄报禁毒漫画 服务器无法启动怎么办啊 维普和知网数据库相差大吗 hcna网络技术考试 网络安全三观是指什么 大学生网络安全小品剧本 软件开发中模型有哪些东西 方舟手游怎么去开服务器免费 nginx服务器视频 小型软件开发常用解决方案 数据库具有弱口令 对日Java软件开发工程师培训 软件开发河南有教的吗 开通服务器端口 软件开发生产经营和非生产经营 阜阳朗涯互联网科技有限公司
0