关于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 的长度了。