插件窝 干货文章 MySQL 中的  UTF8MB4  是定长存储吗?

MySQL 中的  UTF8MB4  是定长存储吗?

字节 字符 存储 UTF8MB4 634    来源:    2025-03-30

MySQL 中 UTF8MB4 的存储特性分析

UTF8MB4 在 MySQL 中不是定长存储,而是变长存储的字符集。让我详细解释一下:

UTF8MB4 的存储特点

  1. 变长编码

    • UTF8MB4 使用 1-4 个字节存储每个字符
    • 实际占用空间取决于字符的 Unicode 码点位置
  2. 存储长度规则

    • 基本多文种平面(BMP)字符(如大部分拉丁字母、汉字):1-3字节
    • 补充字符(如emoji、某些罕见汉字):4字节
  3. 与 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. 支持全球所有字符(需要时可扩展)

实际建议

  1. 现代应用都应使用 UTF8MB4 而非 utf8
  2. 对于需要定长存储的情况,可以考虑:

    • 使用 CHAR 类型(但会浪费空间)
    • 应用层填充到固定长度
    • 使用二进制类型(BINARY/VARBINARY)
  3. 索引长度限制要注意:

    • InnoDB 索引最大长度是 767 字节(默认)
    • 对于 UTF8MB4 的 VARCHAR 列,最多可索引 191 字符(767÷4)