在 MySQL 中,CHAR
和 VARCHAR
是两种用于存储字符串的字段类型,它们的主要区别在于存储方式、长度限制、性能和用途。以下是详细的对比分析:
1. 存储方式
CHAR
-
定长存储
CHAR
会固定分配指定长度的存储空间,无论实际存储的字符串长度是多少。
-
如果字符串长度小于定义的长度,系统会在右侧用空格填充(用于存储),但检索时会去掉填充的空格。
-
-
适用场景:适用于长度固定或接近固定的字符串,比如身份证号、手机号、邮政编码等。
VARCHAR
-
变长存储
VARCHAR
根据实际字符串长度分配存储空间,多余的空间不浪费。
-
在数据存储时,
VARCHAR
会额外占用 1 个或 2 个字节来记录字符串的实际长度。
-
长度 ≤ 255 字节:使用 1 个字节记录长度。
-
长度 > 255 字节:使用 2 个字节记录长度。
-
-
-
适用场景:适用于长度不固定的字符串,比如文章内容、用户输入的备注等。
2. 最大长度
CHAR
-
最大长度为 255 字节。
-
如果定义的长度小于实际存储数据长度,数据会被截断。
VARCHAR
-
最大长度为 65535 字节(需要考虑表的总行长度限制和字符集影响)。
-
实际存储长度受以下因素限制:
-
定义的字段长度。
-
表的总行大小(受限于
InnoDB
的最大行大小约 65535 字节)。 -
字符集:如 UTF-8 字符集下,每个字符占用 1-4 字节。
-
3. 性能
CHAR
-
性能更高:因为是定长存储,查询和更新操作较快(尤其在频繁修改时),无需额外计算字符串长度。
-
适合高频查询和写入操作。
VARCHAR
-
性能稍低:由于是变长存储,涉及额外的长度计算和动态调整存储空间。
-
在长度变化频繁的场景中,性能可能略逊于
CHAR
。
4. 存储空间
CHAR
-
占用的存储空间固定,可能会浪费空间。
-
例如:
CHAR(10)
定义的字段,即使存储abc
,也会占用 10 字节(其余用空格填充)。
-
VARCHAR
-
存储空间利用率更高,只占用实际字符所需的字节数,加上 1 或 2 个字节的长度信息。
-
例如:
VARCHAR(10)
存储abc
只占用 3 字节(加 1 个字节用于长度信息)。
-
5. 数据完整性
-
CHAR 在存储和检索时自动去除尾部的填充空格,可能会导致某些情况下的数据不一致问题。
-
示例:
CREATE TABLE test (col CHAR(5)); INSERT INTO test VALUES ('abc'); SELECT col = 'abc'; -- 返回 TRUE SELECT col = 'abc '; -- 也返回 TRUE(忽略了填充的空格)
-
-
VARCHAR 不会去掉尾部的空格,严格按实际输入存储。
-
示例:
CREATE TABLE test (col VARCHAR(5)); INSERT INTO test VALUES ('abc'); SELECT col = 'abc'; -- 返回 TRUE SELECT col = 'abc '; -- 返回 FALSE(存储的是原始数据)
-
6. 应用场景
-
CHAR
-
固定长度的字符串,例如:
-
国家代码(ISO 标准代码,如
US
,CN
) -
邮政编码
-
身份证号、手机号等
-
-
对性能要求较高,数据长度较短且固定时。
-
-
VARCHAR
-
可变长度的字符串,例如:
-
用户名、邮箱地址
-
动态文本内容(文章、备注等)
-
-
数据长度不确定,存储效率优先时。
-
7. 对比总结表
特性 | CHAR | VARCHAR |
---|---|---|
存储方式 | 定长 | 变长 |
最大长度 | 255 字节 | 65535 字节(受行大小限制) |
存储效率 | 占用固定长度,可能浪费空间 | 按需分配,节省空间 |
性能 | 查询和写入更快 | 查询和写入稍慢 |
尾部空格处理 | 存储时填充,检索时去掉 | 按实际存储,保留尾部空格 |
适用场景 | 固定长度,频繁查询 | 可变长度,存储空间优先 |