MySQL 中 varchar 和 char 有什么区别?
重点回答
varchar和char是两种用于存储字符串的数据类型,最大的区别就是char是固定长度,而varchar是可变长度。
char
固定长度的字符串。无论实际存储的内容多长,都会占用定义时指定的长度,如果存储的内容长度小于定义的长度,MySQL会填充空格以达到指定长度,查询时自动去掉。
char(n):n表示字符数,最大为255;每个字符所占的字节数取决于字符集(如utf8mb4每个字符最多占用4字节)。
varchar
可变长度的字符串。实际存储的内容长度是多少,就占用多少空间。存储时需要额外的1到2个字节来记录字符串的实际长度(字符长度超过255,则使用两个字节)。
varchar(n):n最大为65535(如果值允许为null,则需要额外1bit标记是否为null,且varchar列的长度是可变的,需要1到2个字节(字符长度超过 255,则使用两个字节)用于存储字符串的长度信息,所以支持的最大长度是65535 - 2 = 65533);同理每个字符所占的字节数取决于字符集。
区别
扩展
MySQL在执行order by排序的时候,会利用sort_buffer。
假设a,b,c都是varchar类型,现有SQL——select a, b, c from t where a = 'xxx' order by b;
MySQL计算a b c总长度比较长,sort_buffer可能放不下,就会使用双路排序,大概就是sort_buffer里存放需要排序的字段b和id进行排序,排完序后,再通过id回表查询得到需要查询的a b c字段。这样子多了回表的操作,性能较差。

如果select字段的长度小,那么就使用单路排序,就是将select的数据都放到sort_buffer中,排完序后直接返回给客户端。

这里计算a/b/c长度的依据就是varchar中的n,如果n设置的很大,虽然占用的空间是动态的,但是会隐性影响排序的性能。
#MySQL(21)评论