MySQL varchar最大长度,text类型占用空间剖析

上一篇博文已经介绍了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字节的空间时,表可以创建成功。其他的类型基本都是固定字节的,所以就不再实验,有兴趣的可以自己试试。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值