上一篇博文已经介绍了MySQL的字段类型以及占用的空间大小,接下来看下,varchar,text
最大占用空间,以及text是否占用行的最大长度。
MySQL表中行的最大大小为65,534(实际行存储从第二个字节开始)字节。每个BLOB和TEXT列 账户只占其中的5至9个字节。
那么来验证下varchar
类型的实际最大长度:
测试环境:MySQL版本 5.6.17
//首先要设置下mysql为严格执行模式,不然varchar超出最大长度为自动转为text类型
set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
[SQL]
CREATE TABLE test(
va VARCHAR(21845)
)DEFAULT CHARSET=utf8;
[Err] 1118 - 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
这里看到21845个字符,utf-8
下刚好为65535个字节,但是varchar
保存时用一个字节或两个字节长的前缀+数据。如果varchar
列声明的长度大于255,长度前缀是两个字节,所以varchar的最大长度应为:
65532=65535-1-2(字节)
utf-8下为 21844=65532/3(字符)
看示例:
[SQL]
CREATE TABLE test(
va VARCHAR(21844)
)DEFAULT CHARSET=utf8;
受影响的行: 0
时间: 0.155s
那么看下text
类型在实际行中占用的字节数:
[SQL]
CREATE TABLE test(
va VARCHAR(21841),
tx text
)DEFAULT CHARSET=utf8;
[Err] 1118 - 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
可以看出错误提示,行长已经超过最大长度。在上文看到,
每个BLOB和TEXT列 账户只占其中的5至9个字节。
但是va
字段已经给tx
字段腾出了9字节的空间了啊,为什么还是不行呢。
最好再官方文档看到
BLOB和TEXT类型需要 1、2、3或者4个字节来记录列值的长度,取决于该类型的最大可能的长度。
那么就是至少需要10字节(9+1)的空间了,再试一下:
[SQL]
CREATE TABLE test(
va VARCHAR(21840),
tx text
)DEFAULT CHARSET=utf8;
受影响的行: 0
时间: 0.170s
这里看到,当va
字段腾出12字节的空间时,表可以创建成功。其他的类型基本都是固定字节的,所以就不再实验,有兴趣的可以自己试试。