问题描述
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
大概意思就是行大小太大,不能超过65535
长度改为21842就正常了,这是为什么?
分析
CREATE TABLE `all_type_forlan` (
`id` int(20 NOT NULL COMMENT 'id',
`base_info` varchar(21842 DEFAULT NULL COMMENT '基本详细',
PRIMARY KEY (`id`
ENGINE=InnoDB DEFAULT CHARSET=utf8;
这里的21842长度是怎么来的?
首先它是什么意思?表示21842字符
1、MySQL规则
编码规则
不同字符集下,占用空间不一样
gbk编码中,1个字符占用2个字节
utf8编码(默认)中,1个字符占用3个字节
utf8mb4编码中,1个字符占用4个字节
存储规则
行大小限制
MySQL 表的内部表示具有 65,535 字节的最大行大小限制,即使存储引擎能够支持更大的行。 BLOB 和 TEXT列仅对行大小限制贡献 9 到 12 个字节,因为它们的内容与行的其余部分分开存储
2、验证
还是报错了,因为我们还需要减去额外的存储(长度和是否为NULL),65535-3=65532/2=21844,设置成21844就成功了
验证NULL占用1个字节
说明:tinyint占用1个字节、varchar的长度和是否为NULL占用3个字节
我们把varchar字段设为不是null,此时21844可以设置成功说明:65535-1-2=65532/3=21844
3、结论
计算规则=(65535-4-2-1)/3=21,842.66666666667,向下取整,就是21842说明:int占用4个字节,varchar的长度和是否为NULL占用3个字节,使用了utf8编码,1个字符占用3个字节
解决方案
如果只是想设置一个最大值,那可以根据计算规则进行调整
拓展
为什么我们经常使用varchar(255,不使用varchar(256?
因为varchar类型的字段长度在超过255后,需要2个字节来存储长度,因为1个字节=8位,可以表示的长度为255,2个字节=16位,可以表示的长度为65535
所以varchar(256会比varchar(255多占用1个字节来存储长度
MySQL列数限制
int类型的占用空间的大小范围
编程笔记 » Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535.