背景:在大佬强烈要求下,整理了一下商品总表goods
,发现有个简介description
的字段使用text类型,大佬强烈要求想改为varchar类型,但因为历史缘由,有些类型的商品简介这个字段存的是后台的富文本编辑框内容,查了一下最大长度,有6万多一点(字符数/字数,不是字节数)。函数
后来网上查了一下,varchar类型能够存储的字节和TEXT都是65535个字节。测试
问题:是否是就是说只要设置varchar(65535)就至关于设置了text类型呢?编码
答案:??3d
接下来就本身测试了一番。code
测试版本:5.6cdn
首先,我建立了一个表,==编码为UTF8==。新增text字段,往字段内填充内容,中英文乱七八糟的,结果发现,text确实能够最大字节数为65535(将使用PHP的函数strlen()计算获得长度为65535的数据填充进去刚恰好)。blog
而后,删除text字段,新增varchar字段,发现根本不能设置长度为65535,==最大只能设置为21844,便可以存储包括中英文符号等在内的全部字符数量之和为21844==(将使用PHP的函数mb_strlen()计算获得长度为21844的数据填充进去刚恰好)。ip
缘由:由于UTF8编码按每一个字符最多要占用三个字节数计算,65535/3=21845,又由于varchar自己要占用一个字节(这里我不肯定utf8编码是否要占用三个字节,仍是占用了一个字节剩下两个字节凑不够一个字符),因此少了一个字符数量。it
其实,所谓的varchar类型能够存储65535个字节,是对于MySQL表的行大小的限制为65535个字节。==即每张表全部字段长度加起来的总字节数不能大于65535个字节。==io
如今,我再去新增一个字段,int类型,发现建立失败!!
提示以下错误:
缘由:int类型要占用表的一个字符数,可是varchar字段已经使用了MySQL行最大限制上限,因此致使新增字段失败。
接着,我随意新增字段,并有意减小varchar字段长度,作最大上限测试。
得出如下结论:
==根据建立表的编码类型,不一样的类型须要占用的字符数不一样==,UTF8编码下:
最后回顾一下问题:
是否是就是说只要设置varchar(65535)就至关于设置了text类型呢?
答案:错误的!!
varchar类型存储长度与表的编码有关系。
当我尝试新建一个表,编码为单字节字符集latin1类型,最终能够设置的最大长度以下(也达不到65535):
因此,得出结论:当下我这个goods
表中的description
字段没法修改类型为varchar。
缘由:①utf8编码下,长度不够;②这个字段长度设置过大,会致使容易达到表的行最大限制长度,这个问题会致使新增字段都新增不了!!!