为什么 MySQL 引入 utf8mb4 数据类型?
MySQL 中 utf8mb4 的存储性质
在知乎的讨论中,有人提出 MySQL 引入 utf8mb4 数据类型的原因。本文将探讨 utf8mb4 的存储特性,以回答此问题。
utf8mb3 与 utf8mb4 的存储
MySQL 中原本的 utf8mb3 存储字符集最多三个字节一个字符,而 utf8mb4 支持四个字节的存储。
在之前,由于 MyISAM 存储引擎是默认引擎,其具有静态表格特性,使得 utf8mb3 的存储长度固定为最长三个字节。然而,在 InnoDB 成为默认引擎后,此特性不再适用。因此,在所有引擎中,utf8mb4 的存储长度都是可变的。
BMP 字符的存储
在 Unicode 中,BMP(基本多语言平面)包含了绝大多数常见语言的常见字符。对于 BMP 字符,utf8mb3 和 utf8mb4 具有相同的存储特性,长度为一到三个字节。这意味着在存储 BMP 字符时,utf8mb4 并不会占据额外的存储空间。
补充字符的存储
除了 BMP 字符之外,Unicode 还包含一些补充字符,这些字符位于 BMP 之外。utf8mb3 无法存储补充字符,而 utf8mb4 则可以。当将 utf8mb3 列转换为 utf8mb4 列时,这些补充字符不会被转换,因为 utf8mb3 中原本就不存在这些字符。
因此,utf8mb4 的存储长度取决于存储的字符集。对于 BMP 字符,它与 utf8mb3 长度相同。对于补充字符,它则需要四个字节的存储空间。