# MySQL 字符集的终极巨坑 —— `utf8` vs `utf8mb4` ### 一句话总结 MySQL 中的 `utf8` 是个“假货”(最多只支持 3 字节),`utf8mb4` 才是真正的 UTF-8(支持 4 字节)。 ### 为什么会有这个坑 - **历史遗留**:早期 MySQL 开发时,Unicode 字符确实只用 3 个字节就能存下。 - **现象**:一旦用户输入 **Emoji 表情**(如 😀)或部分**生僻字**(如 𰻝),数据库会直接抛出错误:`Incorrect string value`。 ### 📊 核心对比 | 字符集 | 真实身份 | 最大字节数 | 能否存 Emoji | 状态 | | :------------ | :----------------- | :--------- | :----------- | :--------- | | **`utf8`** | `utf8mb3` (阉割版) | 3 字节 | ❌ 报错 | ⚠️ 已废弃 | | **`utf8mb4`** | 真正的 UTF-8 | 4 字节 | ✅ 随便存 | ✅ 推荐使用 | ### 🛠️ 各版本现状与未来 - **MySQL 5.7 及以前**:默认字符集是 `latin1`,`utf8` 是重灾区。 - **MySQL 8.0 及以后**:**默认字符集已改为 `utf8mb4`**(新项目安全系数提升)。 - **官方态度**:目前 `utf8`(即 `utf8mb3`)已被标记为 Deprecated(废弃)。官方计划在**未来的某个大版本中彻底删除 `utf8mb3`**,并让 `utf8` 这个名字正式指向 `utf8mb4`。