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

发布了14 篇原创文章 · 获赞 11 · 访问量 4万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览