MySQL 中的 UTF8MB4 是定长存储吗?
MySQL 中 UTF8MB4 的存储特性分析
UTF8MB4 在 MySQL 中不是定长存储,而是变长存储的字符集。让我详细解释一下:
UTF8MB4 的存储特点
变长编码:
- UTF8MB4 使用 1-4 个字节存储每个字符
- 实际占用空间取决于字符的 Unicode 码点位置
存储长度规则:
- 基本多文种平面(BMP)字符(如大部分拉丁字母、汉字):1-3字节
- 补充字符(如emoji、某些罕见汉字):4字节
与 UTF8 的区别:
- MySQL 的 "utf8" 实际上是阉割版,最多只支持3字节
- UTF8MB4 才是真正的 UTF-8 实现,支持4字节字符
对存储空间的影响
- CHAR(N):固定分配 N×4 字节的空间(即使实际字符更短)
- VARCHAR(N):实际占用 1-4×N 字节 + 长度标识(1-2字节)
- TEXT 类型:完全变长存储
为什么不是定长
Unicode 设计本身就是变长编码,目的是:
1. 兼容 ASCII(1字节)
2. 节省存储空间(常用字符用更少字节)
3. 支持全球所有字符(需要时可扩展)
实际建议
- 现代应用都应使用 UTF8MB4 而非 utf8
对于需要定长存储的情况,可以考虑:
- 使用 CHAR 类型(但会浪费空间)
- 应用层填充到固定长度
- 使用二进制类型(BINARY/VARBINARY)
索引长度限制要注意:
- InnoDB 索引最大长度是 767 字节(默认)
- 对于 UTF8MB4 的 VARCHAR 列,最多可索引 191 字符(767÷4)