MySQL 字符集和排序规则有什么区别?utf8mb4 为什么更推荐?
简化版
字符集决定字符如何编码存储,排序规则决定字符如何比较和排序。MySQL 里的 utf8 历史上通常是 utf8mb3,最多 3 字节,不能完整存储 emoji 等 4 字节 Unicode 字符;utf8mb4 才是更完整的 UTF-8 实现。实际建库建表更推荐统一使用 utf8mb4,排序规则按是否区分大小写、重音和语言习惯选择。
详细版
字符集解决“能不能存、怎么存”,排序规则解决“怎么比、怎么排”。比如同样是 utf8mb4 字符集,不同 collation 下,A 和 a 是否相等、中文如何排序、是否区分重音,结果都可能不同。
面试中要特别提 MySQL 的 utf8 命名历史问题。很多老系统使用 utf8,实际是 utf8mb3,遇到 emoji、部分生僻字或特殊符号会报错或截断。新项目通常推荐 utf8mb4,并在库、表、列、连接层保持一致。
完整版教学
一、字符集是什么
字符集定义字符到字节的编码方式。
数据库需要知道一个字符串如何存进磁盘。
如果字符集不支持某个字符,插入时可能报错。
常见字符集包括 latin1、gbk、utf8mb3、utf8mb4。
现代中文和国际化项目一般选择 utf8mb4。
二、排序规则是什么
排序规则也叫 collation。
它定义字符串比较和排序规则。
同一字符集可以有多个排序规则。
例如是否大小写敏感、是否重音敏感、是否按二进制比较。
所以字符集和排序规则不是一回事。
三、utf8mb4 的意义
MySQL 的 utf8 曾长期表示 utf8mb3。
utf8mb3 最多使用 3 字节表示一个字符。
完整 Unicode 中有些字符需要 4 字节。
emoji 就是线上最常见的例子。
因此新系统更推荐直接使用 utf8mb4。
四、常见配置层级
| 层级 | 作用 | 注意点 |
|---|---|---|
| server | 默认字符集 | 影响新建对象默认值 |
| database | 库默认字符集 | 建表未指定时继承 |
| table | 表默认字符集 | 列未指定时继承 |
| column | 列字符集 | 最终存储以列为准 |
| connection | 连接字符集 | 影响客户端和服务端传输 |
如果层级不一致,排查乱码会很痛苦。
五、建表示例
CREATE TABLE user_profile (
id BIGINT PRIMARY KEY,
nickname VARCHAR(64) NOT NULL
) CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
具体 collation 要看 MySQL 版本和业务规则。
如果要求大小写敏感,可以考虑 _bin 或对应 case-sensitive 规则。
六、索引长度影响
字符集会影响字符串字段占用字节数。
utf8mb4 每个字符最多 4 字节。
老版本 MySQL 对索引长度限制更敏感。
所以老系统从 utf8 升级到 utf8mb4 时,要检查索引长度、字段长度和版本限制。
字符集升级不是只改建表语句,还要评估历史数据、索引长度、连接参数和回滚方案。
七、误区和追问
- 误区:MySQL 的 utf8 就是完整 UTF-8。 很多版本里
utf8实际是utf8mb3,不支持 4 字节字符。 - 误区:字符集决定排序结果。 排序结果主要由 collation 决定。
- 误区:只改库默认字符集就能修复所有表。 已存在表和列不会自动全部变更。
- 追问:为什么 emoji 插入失败? 常见原因是列、表或连接层仍使用
utf8mb3。 - 追问:大小写不敏感是哪里控制的? 通常由 collation 控制,例如
_ci表示 case-insensitive。 - 追问:乱码怎么排查? 查列字符集、连接字符集、客户端编码和历史写入编码是否一致。
八、面试收束
回答时先区分字符集和排序规则。
再解释 MySQL utf8 与 utf8mb4 的历史差异。
最后补充配置层级、索引长度和线上迁移风险。
九、常见误区与追问
- 误区:只记住 MySQL 字符集和排序规则有什么区别?utf8mb4 为什么更推荐? 的结论就够了。 数据库题通常还要解释索引、事务、锁、执行计划或一致性边界,否则很容易被追问打穿。
- 误区:能查出结果就说明 SQL 或设计没问题。 还要看数据量扩大到 100 万行后是否仍能走合适索引、是否产生临时表或锁等待。
- 误区:所有场景都追求强一致。 读写分离、缓存、异步任务都可能牺牲一部分实时性,关键是说明业务是否允许。
- 追问:线上变慢时你先看什么? 先看慢 SQL、执行计划、扫描行数、锁等待和连接池,再判断是 SQL 写法、索引还是并发问题。
- 追问:如何证明这个方案可落地? 给出一个小数据例子,再补充约束、失败场景和回滚方案,避免只停留在概念层。
十、加强记忆
记 MySQL 字符集和排序规则有什么区别?utf8mb4 为什么更推荐? 时,把它压成“语义正确、执行高效、并发安全”三件事。先说清这个知识点解决什么数据库问题,再用 1 个带数字的小例子说明数据量一大为什么会出差异,最后补上索引、锁、事务或执行计划里的易错点。这样面试官无论追问 SQL 写法、线上慢查,还是并发一致性,你都能沿着同一条线继续展开。