背景:在大佬强烈要求下,整理了一下商品总表goods
,发现有个简介description
的字段使用 text 类型,大佬强烈要求想改成 varchar 类型,但由于历史原因,有些类型的商品简介这个字段存的是后台的富文本编辑框内容,查了一下最大长度,有 6 万多一点(字符数/字数,不是字节数)。
后来网上查了一下,varchar 类型可以存储的字节和 TEXT 都是 65535 个字节。
问题:<font style="color:red">是不是就是说只要设置 varchar(65535)就相当于设置了 text 类型呢?</font>
答案:<font style="color:red">??</font>
接下来就自己测试了一番。
测试版本:5.6
首先,我创建了一个表,==编码为 UTF8==。新增 text 字段,往字段内填充内容,中英文乱七八糟的,结果发现,text 确实可以最大字节数为 65535(将使用 PHP 的函数 strlen()计算得到长度为 65535 的数据填充进去刚刚好)。
然后,删除 text 字段,新增 varchar 字段,发现根本不能设置长度为 65535,==最大只能设置为 21844,即可以存储包括中英文符号等在内的所有字符数量之和为 21844==(将使用 PHP 的函数 mb_strlen()计算得到长度为 21844 的数据填充进去刚刚好)。
原因:<font style='color:red'>因为 UTF8 编码按每个字符最多要占用三个字节数计算,65535/3=21845,又因为 varchar 本身要占用一个字节(这里我不确定 utf8 编码是否要占用三个字节,还是占用了一个字节剩下两个字节凑不够一个字符),所以少了一个字符数量。</font>
其实,所谓的 varchar 类型可以存储 65535 个字节,是对于 MySQL 表的行大小的限制为 65535 个字节。==即每张表所有字段长度加起来的总字节数不能大于 65535 个字节。==
现在,我再去新增一个字段,int 类型,发现创建失败!!
提示如下错误:
原因:<font style="color:red">int 类型要占用表的一个字符数,但是 varchar 字段已经使用了 MySQL 行最大限制上限,所以导致新增字段失败。</font>
接着,我随意新增字段,并有意减少 varchar 字段长度,做最大上限测试。
得出以下结论:
==根据创建表的编码类型,不同的类型需要占用的字符数不同==,UTF8 编码下:
tinyint 类型占本身一个字符。
int 类型占本身一个字符+1(存储 length 长度)。
char 类型占 length 长度
varchar 类型占本身一个字符+length 长度
text 类型占本身四个字符
最后回顾一下问题:
<font style="color:red">是不是就是说只要设置 varchar(65535)就相当于设置了 text 类型呢?</font>
答案:<font style='color:red'>错误的!!</font>
varchar 类型存储长度与表的编码有关系。
当我尝试新建一个表,编码为单字节字符集 latin1 类型,最终可以设置的最大长度如下(也达不到 65535):
所以,得出结论:<font style='color:red'>当下我这个goods
表中的description
字段无法修改类型为 varchar。</font>
<font style='color:red'>原因:①utf8 编码下,长度不够;②这个字段长度设置过大,会导致容易达到表的行最大限制长度,这个问题会导致新增字段都新增不了!!!</font>
原文:https://xie.infoq.cn/article/e61c5b150c696eb80cc37af82
想要获取学习实战、高并发、架构 、笔试面试资料 请关注架构师学习路线图 复制