暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 长度问题

架构师学习路线 2021-03-31
286

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


想要获取学习实战、高并发、架构 、笔试面试资料
请关注架构师学习路线图
复制
文章转载自架构师学习路线,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论