之前有一个需求,要求输入描述限制上限为5000字符。由于需要新设计表结构,所以我有了一个疑问,到底设计表的时候,字段类型如何才能更合理,不浪费存储空间,于是了解了一下比较常用的char、varchar、text的区别。
首先需要知道汉字和字节字符的关系,关系如下:
1、 1个汉字 = 1个字 = 1个字符
2、 1个字符 = 1个字节 = 8bit(ACSII码下)
3、 1个字符 = 2个字节 = 16bit(Unicode码下)
字符并不是计算机语言, 一般情况下,汉字一个字占两个字节。英文字母一个字母占一个字节。
我试了下char(2)和varchar(2), 都能存2个英文字母或者2个汉字, varchar(10) 既10个字符可以存10个汉字,不太明白这个n是表示字节还是字符,查了下资料:
1、char(n)和varchar(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m*3个字节。
2、同时char和varchar最大的区别就在于char不管实际value都会占用n个字符的空间,而varchar只会占用实际字符应该占用的空间+1,并且实际空间+1<=n。
3、超过char和varchar的n设置后,字符串会被截断。
4、char的上限为255字节,varchar的上限65535字节,text的上限为65535。
5、char在存储的时候会截断尾部的空格,varchar和text不会。
6、varchar会使用1-3个字节来存储长度,text不会。
我使用的mysql版本是14.14,括号中的数字指的是长度,char范围是0~255,varchar最长是64k。
char>varchar>text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替char。
所以综上这个字段设计时候我写成了varchar(5000),虽然看起来比较奇怪,但是比text更合适一点。