直接回答
char 是定长字符串,声明多少长度就占多少空间,不足部分以空格补齐(检索时会去掉尾部空格);varchar 是变长字符串,按实际内容存储,额外用 1~2 个字节记录长度。char 适合长度固定或接近固定的短数据(如 MD5、手机号、国家码),varchar 适合长度差异大的数据(如用户名、标题)。
展开解析
- 存储开销:char(N) 始终占 N 个字符的空间;varchar(N) 占实际长度 + 长度前缀(≤255 字节用 1 字节,否则 2 字节)。
- 性能:char 定长,行内定位快,更新时不容易产生页分裂和碎片;varchar 变长,若更新后变长可能引发行迁移。但 char 对短内容浪费空间,反而可能降低页内行密度。
- 细节易错点:MySQL 中 N 指字符数而非字节数,实际字节取决于字符集(utf8mb4 一个字符最多 4 字节);char 存 'ab ' 尾部空格会被截掉,varchar 会保留——做相等比较时行为有差异。
- 实践建议:长度几乎固定用 char,其余一律 varchar;varchar 长度声明别拍脑袋给 255,够用即可(影响排序/临时表的内存分配)。