面试题:MySQL 中 varchar 和 char 有什么区别?

在 MySQL 中,VARCHAR 和 CHAR 是两种常用的字符串数据类型,它们在存储方式、性能和适用场景上有显著区别。以下是它们的详细对比:


1. 存储方式

1.1 CHAR

  • 固定长度CHAR 是固定长度的字符串类型。无论实际存储的字符串长度是多少,CHAR 都会占用定义的长度。
  • 存储空间:如果定义 CHAR(10),即使存储的字符串是 "abc",它也会占用 10 个字符的存储空间,不足的部分会用空格填充。
  • 检索效率:由于长度固定,CHAR 的检索效率较高。

1.2 VARCHAR

  • 可变长度VARCHAR 是可变长度的字符串类型。它只占用实际存储的字符串长度加上额外的 1-2 个字节(用于记录字符串长度)。
  • 存储空间:如果定义 VARCHAR(10),存储的字符串是 "abc",它只会占用 3 个字符的存储空间。
  • 检索效率:由于长度可变,VARCHAR 的检索效率相对较低。

2. 存储空间

2.1 CHAR

  • 适合存储长度固定的字符串(如 MD5 值、UUID 等)。
  • 如果存储的字符串长度变化较大,会导致存储空间浪费。

2.2 VARCHAR

  • 适合存储长度变化较大的字符串(如用户姓名、地址等)。
  • 存储空间利用率高,但需要额外的 1-2 个字节记录长度。

3. 性能

3.1 CHAR

  • 读取性能:由于长度固定,CHAR 的读取性能较高。
  • 写入性能:如果存储的字符串长度小于定义的长度,会用空格填充,可能导致额外的写入开销。

3.2 VARCHAR

  • 读取性能:由于长度可变,VARCHAR 的读取性能较低。
  • 写入性能:存储空间利用率高,写入性能较好。

4. 适用场景

4.1 CHAR

  • 适合存储长度固定的字符串,例如:
    • MD5 值(32 字符)。
    • UUID(36 字符)。
    • 状态码(如 Y/N)。

4.2 VARCHAR

  • 适合存储长度变化较大的字符串,例如:
    • 用户姓名。
    • 电子邮件地址。
    • 文章内容。

5. 最大长度

5.1 CHAR

  • 最大长度为 255 字符。

5.2 VARCHAR

  • 在 MySQL 5.0.3 之前,最大长度为 255 字符。
  • 在 MySQL 5.0.3 及之后,最大长度为 65535 字节(实际可用长度受字符集和行大小限制)。

6. 空格处理

6.1 CHAR

  • 存储时会用空格填充到定义的长度。
  • 检索时会自动去除末尾的空格。

6.2 VARCHAR

  • 存储时不会用空格填充。
  • 检索时会保留字符串中的空格。

7. 示例

7.1 创建表

CREATE TABLE example (
    id INT PRIMARY KEY,
    fixed_string CHAR(10),
    variable_string VARCHAR(10)
);

7.2 插入数据

INSERT INTO example (id, fixed_string, variable_string)
VALUES (1, 'abc', 'abc');

7.3 查询数据

SELECT fixed_string, variable_string FROM example;
  • fixed_string 的值是 'abc '(用空格填充到 10 字符)。
  • variable_string 的值是 'abc'

8. 选择建议

  • 如果字符串长度固定且较短,使用 CHAR
  • 如果字符串长度变化较大,使用 VARCHAR
  • 对于非常长的字符串(如文章内容),使用 TEXT 类型。

总结

特性CHARVARCHAR
存储方式固定长度可变长度
存储空间固定,可能浪费空间动态,节省空间
读取性能较高较低
写入性能可能因填充空格而较低较高
适用场景固定长度的字符串长度变化较大的字符串
最大长度255 字符65535 字节(受限制)
空格处理存储时填充空格,检索时去除存储和检索时保留空格

根据实际需求选择合适的类型,可以有效提升数据库的性能和存储效率。

THE END
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容