varchar和char在MySQL数据库中都是用来保存字符型数据的,但是无论从结构还是从数据的保存方式来看,两者的相差很大。
定长与变长
char 表示定长,长度固定,比如char(10),表示存储的是10个字符,无论你插入的是多少,都是10个,如果少于10个,则用空格填满。
varchar表示变长,即长度可变。varchar(10),当插入的字符小于10个的话,则插入多少个字符就存多少个。对于varchar来说,因为需要知道所存储字符的长度,需要使用一个(如果字符串长度小于255)或两个字节(长度大于255)来存储字符串的长度。
存储容量的差异
对 char 来说,最多能存放的字符个数 255,和编码无关。
varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535字符。
根据编码不同,长度限制也不同:
字符类型为Latin1,每个字符占用1个字节,最大长度不能超过65532;
字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。
计算方法为:
(65535-1-2)/每个字符占用的字节数= 32766 个字符。
减1的原因是实际行存储从第二个字节开始;
减2的原因是varchar头部的2个字节表示长度;
转载请注明:知识蚂蚁 » MySQL中varchar与char的区别