在 MySQL 的字段类型中,char
和varchar
是用来处理字符串。本文来学习二者区别
一、本质区别:空间分配的 “固执” 与 “灵活”
1. char
:空间占满
固定长度特性:
定义时指定长度(如char(10)
),无论实际存储内容长短,强制占用固定字节数,不足部分用空格填充。- 存储
'abc'
到char(10)
中,实际存储为'abc '
(7 个空格补位),占用 10 字节。 - 若字段定义为
char(5)
,存入'hello world'
会被截断为'hello'
(超过长度直接丢弃)。 - 查询效率高。
- 存储
2. varchar
:可变空间
可变长度特性:
按实际数据长度分配空间,额外用1-2 字节存储长度值(长度≤255 时用 1 字节,>255 时用 2 字节)。
举例:- 存储
'abc'
到varchar(255)
中,占用3(数据)+1(长度)=4
字节。
- 存储
存储特点:
- 空间利用率高,但写入时需动态分配空间,写入效率略低于 char。
二、性能对比:读写速度的 “得” 与 “失”
维度 | char |
varchar |
---|---|---|
写入性能 | 快(固定位置写入,无需计算长度) | 稍慢(需计算长度 + 动态分配空间) |
读取性能 | 更快(直接按偏移量定位数据) | 稍慢(需先读长度再取数据) |
空间占用 | 高(可能浪费大量空白空间) | 低(按需分配,空间利用率高) |
典型场景对比:
- 若存储手机号(固定 11 位),用
char(11)
比varchar(11)
读取更快,且空间浪费可忽略(仅 11 字节)。 - 若存储用户简介(长度可能 10-1000 字),
varchar(1000)
比char(1000)
节省空间。
三、适用场景
1. char
- 固定长度数据:
- 密码(如 MD5 值固定 32 位)、身份证号、邮政编码等。
- 优势:避免数据长度不一致导致的索引效率下降,例如
char
字段的索引查询速度可能更快。
- 短文本且性能优先:
- 状态字段(如
Y/N
、0/1
),用char(1)
存储,查询时直接按位置匹配,效率极高。
- 状态字段(如
2. varchar
- 变长文本:
- 用户名(长度 5-20 字符)、商品描述、地址等长度不固定的数据。
- 案例:电商平台的商品名称字段,用
varchar(200)
可覆盖 99% 的场景,且比char(200)
节省大量空间。
四、细节
1. 尾部空格
char
字段会保留尾部空格,可能导致查询失败:sql
-- 存储时为'13812345678'(无空格),查询时带空格会匹配失败 SELECT * FROM users WHERE phone = '13812345678 ';
解决方案:- 插入数据时用
TRIM()
去空格:INSERT INTO users(phone) VALUES(TRIM(' 13812345678 '));
- 插入数据时用
五、总结
场景判断 | 选char |
选varchar |
---|---|---|
数据长度是否固定 | 是(如手机号、MD5 值) | 否(如昵称、地址) |
空间敏感程度 | 低(允许固定浪费) | 高(需节省空间) |
查询性能优先级 | 读性能优先(如高频查询字段) | 写性能或空间优先(如日志数据) |
学习记录,如有错误,请大佬指正!