关于varchar的总结

摘自:https://www.jianshu.com/p/c3e188440c67

 

大家都知道用 varchar 比用 char 类型更省空间(不过性能略有下降,char查询更快),相对于定长的 char ,varchar 存储分为两部分:

varchar字段长度 = 字符串长度值 + 实际数据长度 N

字符串长度值视实际数据长度,需占用 1 或 2 个字节存储。所以,我们得出:

当实际数据长度 <= 255 时,varchar字段长度 = 1 + N;
当实际数据长度 > 255 时,varchar字段长度 = 2 + N;

因此,在设计数据表时,varchar(64) 和 varchar(255) 在实际应用中占用存储是一样的;varchar(256) 和 varchar(50000) 也是一样的。

所以,varchar(n)的分水岭就是255。varchar(n),在255以下,无论设置n是多少都没区别。在varchar(255)以上,直到最大值,无论设置n是多少也没区别

比如有些数据库里设置varchar(1023)之类的,其实这个和varchar(1024),varchar(1234)什么的都没有任何区别!1023并不会比1024少用一个字节,1023并不是一个特殊值,只有255才是。

所以设计数据库字段的时候,只需要考虑字符串是否会超过255就可以了,其他不用考虑。需要注意的是,这里varchar(n)的n是字符长度,不是字节长度,实际占用空间跟字符编码有关。


那么问题来了,为什么不在设计时就尽可能把最大长度设置大一些,免得未来长度不够惹麻烦呢?比如,用户名能用 varchar(200) 就不必用 varchar(20),存储稍大一些字符串的字段,能用 varchar(2000) 就不必斤斤计较用 varchar(256)。

这么长的空间,能存储多少汉字呢?如果采用 UTF-8 编码存储,每个汉字占用 3 个字节;如果采用可以放表情的 utf8mb4,每个汉字占用 4字节。

当然,长度也不是可以无限长,varchar 字段长度在设计表时需要考虑下面因素:

  • UTF-8 状态下,单个 varchar 长度不能超过 (65535 - 2) / 3 = 21844;
  • 一行数据所有字段长度加起来不能超过 65535;
  • 如果需要存储超长文本,考虑使用 text 类型,只存储指针长度
    所以,知道了上面的知识点后,下次在设计数据库的时候,就不必太纠结 varchar(N) 中的 N 值了,条件允许的前提下,尽可能设大一些吧。

所以不要再吝啬 varchar 的长度了。




posted @ 2019-08-23 23:23  Roy-Xin  阅读(1597)  评论(0编辑  收藏  举报