MySQL长度问题

背景:在大佬强烈要求下,整理了一下商品总表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编码下:

  • tinyint类型占自己一个字符。
  • int类型占自己一个字符+1(存储length长度)。
  • char类型占length长度
  • varchar类型占自己一个字符+length长度
  • text类型占自己四个字符

最后回顾一下问题:

是否是就是说只要设置varchar(65535)就至关于设置了text类型呢?

答案:错误的!!

varchar类型存储长度与表的编码有关系。

当我尝试新建一个表,编码为单字节字符集latin1类型,最终能够设置的最大长度以下(也达不到65535):

因此,得出结论:当下我这个goods表中的description字段没法修改类型为varchar。

缘由:①utf8编码下,长度不够;②这个字段长度设置过大,会致使容易达到表的行最大限制长度,这个问题会致使新增字段都新增不了!!!

相关文章
相关标签/搜索