MySQL面试题 - MySQL 中varchar 和 char 有什么区别?
回答重点
CHAR和VARCHAR是两种用于存储字符串的列类型,它俩最大的不同就是一个是固定长度,一个是可变
长度。
- CHAR(n):固定长度的字符串。CHAR列的长度是固定的,即使存储的字符串长度小于定义的长度,MySQL也会在字符串的末尾填充空格以达到指定长度(如果char类型的字符串后面有空格的话, innodb会忽略)。
- VARCHAR(n):可变长度的字符串。VARCHAR列的长度是可变的,存储的字符串长度与实际数据长度相等,并且在存储数据时会额外增加1到2个字节(字符长度超过255,则使用两个字节)用于存 储字符串的长度信息。
理论上来说CHAR会比VARCHAR快,因为VARCHAR长度不固定,处理需要多一次运算,但是实际上这种运算耗时微乎其微,而固定大小在很多场景下比较浪费空间,除非存储的字符确认是固定大小或者本
身就很短,不然业务上推荐使用VARCHAR。
下面以表格方式总结方便横向对比:
一、基本概念
在 MySQL 中,CHAR 和 VARCHAR 都是用来存储字符串的数据类型,但它们在存储方式和性能特性上有显著差异。
二、存储方式对比
1. CHAR - 定长字符串
CHAR 是固定长度的字符串类型,声明时需要指定长度(如 CHAR(10))。无论实际存储的字符串长度是多少,MySQL 都会分配指定长度的存储空间。
2. VARCHAR - 变长字符串
VARCHAR 是可变长度的字符串类型,只占用实际需要的存储空间加上1-2个字节的长度前缀。
三、主要区别
特性 | CHAR | VARCHAR |
---|---|---|
存储方式 | 固定长度 | 可变长度 |
存储空间 | 总是使用声明长度的空间 | 只使用实际需要的空间+长度前缀 |
最大长度 | 255字符 | 65,535字符 |
空格处理 | 自动填充空格到指定长度 | 不填充空格 |
检索速度 | 通常更快(固定长度) | 通常稍慢 |
适用场景 | 长度固定的数据(如MD5) | 长度变化大的数据(如用户名) |
四、性能考量
-
CHAR 的优势:
- 固定长度,检索速度更快
- 不需要计算长度,直接定位
- 适合频繁更新且长度固定的字段
-
VARCHAR 的优势:
- 节省存储空间
- 对于长度变化大的数据更高效
- 减少I/O操作(特别是大表)
五、实际应用建议
-
使用 CHAR 的场景:
- 存储固定长度的代码(如国家代码CHAR(2))
- 加密哈希值(如MD5 CHAR(32))
- 性别字段(CHAR(1)存储’M’或’F’)
-
使用 VARCHAR 的场景:
- 用户姓名、地址等长度不固定的数据
- 评论、描述等文本内容
- 大多数用户输入的数据
六、注意事项
- 在 MySQL 5.0.3 之前,VARCHAR 的最大长度是255字符,之后增加到65,535字符
- CHAR 和 VARCHAR 的尾部空格处理不同:
- CHAR 在检索时会删除尾部空格
- VARCHAR 会保留尾部空格
- 使用 UTF-8 等多字节字符集时,需要考虑字符与字节的区别
七、总结
CHAR 和 VARCHAR 的选择应该基于数据的实际特性和使用场景。固定长度、频繁查询的字段适合使用 CHAR,而长度变化大、存储空间敏感的数据则更适合使用 VARCHAR。合理选择这两种类型可以优化数据库的存储效率和查询性能。