- MySQL表具有65,535字节的最大行大小限制,即使存储引擎能够支持更大的行也是如此。
- 对于默认的16KB InnoDB页大小,最大行大小略小于8KB 。对于64KB页,最大行大小略小于16KB。如果包含可变长度列(例如:text)的InnoDB 行超过最大行大小,InnoDB选择可变长度列进行页外存储。
MySQL对表设计时候,肯定有小伙伴遭遇表字段一多,而设计又烂的话,会发现表无法创建,错误如下:
mysql
更改列为 TEXT可以避免MySQL 65,535字节的行大小限制,而InnoDB 变长列的页外存储可以避免 InnoDB行大小限制。
mysql
变长限制
可变列的长度要计算字符集
- 设置允许 NULL 需要占用1个字节
- 设置为变长(varchar)需要占用2个字节,char 由于定长不占
实际长度为 32765+2[变成加2字节] 和 32766+2 ,正好是65535,没有超出限制
mysql
创建表的语句t2失败是因为,尽管列长度在最大长度65,535字节之内,但仍需要两个额外的字节来记录该长度,这会导致行大小超过65,535字节
mysql
设置为允许 null
实际长度为 32765+2[变成加2字节]+1[允许null加1字节] 和 32766+2 ,超出65535限制了
mysql
字符集差异
设置字符集为 utf8 ,如下语句由于 21845 * 3 + 2【变长需要加2字节】= 65537 > 65535,因此创建失败
mysql
由于设置为 21844,而字符集为 utf8 ,因此 21844 * 3 + 2 = 65534,因此能正常创建
mysql
utf8mb4同理,不过是 * 4
单行8126限制
- innodb 一个 page 至少需要存放2行,单行有 8126的限制
- 若t5表如果写入全为255字节的数据同样会报8126错误
mysql