MySQL 中 varchar 和 char 有什么区别?

三月 15, 2025 / 十六 / 0阅读 / 0评论/ 分类: 数据库

重点回答

varcharchar是两种用于存储字符串的数据类型,最大的区别就是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);同理每个字符所占的字节数取决于字符集。

区别

char

varchar

存储方式

定长字符串(长度小于定义,填充空格)

变长字符串(不会额外填充空格)

存储空间

始终占用固定长度空间

只占用实际需要的存储空间

性能影响

始终占用固定长度空间,可能会浪费一些空间(不需要额外记录长度信息,某些情况下更快)

只占用实际需要的存储空间,可以节省空间(需额外记录长度信息,占1~2字节),某些情况下可能会稍微影响性能

适用场景

适合存储定长且短的字符串,频繁读取。如国家代码、性别等

适合存储变化或较长的字符串。如用户名、地址、描述性文本等

扩展

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)

评论