Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


12.9 Unicode 支持

Unicode标准包括基本多语言平面(BMP)中的字符和超出BMP的补充字符。这一节描述了MySQL对Unicode的支持。关于Unicode标准本身,请访问Unicode协会网站

BMP字符具有以下特征:

  • 它们的代码点值在0和65535(或U+0000U+FFFF)之间。

  • 它们可以使用8、16或24位(1到3个字节)的可变长度编码。

  • 它们可以使用16位(2个字节)的固定长度编码。

  • 它们对于大多数主要语言的字符来说已经足够了。

补充字符位于 BMP 之外:

  • 它们的代码点值在 U+10000U+10FFFF 之间)。

  • Unicode 对补充字符的支持需要字符集具有 BMP 字符之外的范围,因此比 BMP 字符占用更多空间(每个字符最多 4 个字节)。

UTF-8( Unicode 转换格式,使用 8 位单元)用于编码 Unicode 数据,遵循 RFC 3629,该标准描述了以一个到四个字节的编码序列。UTF-8 的想法是,各种 Unicode 字符使用不同的字节序列进行编码:

  • 基本拉丁字母、数字和标点符号使用一个字节。

  • 大多数欧洲和中东脚本字母适合 2 个字节序列:带tilde、macron、acute、grave 和其他标点的扩展拉丁字母(包括希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语等)。

  • 韩文、中文和日文字符使用 3 个或 4 个字节序列。

MySQL 支持这些 Unicode 字符集:

  • utf8mb4: UTF-8 编码的 Unicode 字符集,使用一个到四个字节 per 字符。

  • utf8mb3: UTF-8 编码的 Unicode 字符集,使用一个到三个字节 per 字符。这一字符集已经弃用,未来版本中将被删除;请使用 utf8mb4

  • utf8:已弃用的 utf8mb3 别名;请使用 utf8mb4

    Note

    utf8 在 MySQL 未来版本中将变为 utf8mb4 的别名。

  • ucs2:Unicode 字符集的 UCS-2 编码,使用两个字节表示每个字符。已弃用;预计在将来版本中删除该字符集支持。

  • utf16: Unicode 字符集的 UTF-16 编码,使用两个或四个字节表示每个字符。类似于 ucs2,但具有补充字符扩展功能。

  • utf16le: Unicode 字符集的 UTF-16LE 编码,使用小端序而不是大端序。

  • utf32: Unicode 字符集的 UTF-32 编码,使用四个字节表示每个字符。

Note

字符集 utf8mb3 已弃用,建议使用 utf8mb4。当前 utf8utf8mb3 的别名,但现在已被弃用,预计将来会变为 utf8mb4。MySQL 8.4 也在信息架构表的列和 SQL 命令输出中显示 utf8mb3 而不是 utf8

此外,您还应该注意,老版本 MySQL 的 collation 使用 utf8_ 前缀已经被重新命名为 utf8mb3_

为了避免关于 utf8 的歧义,建议在字符集引用中明确指定 utf8mb4

表 12.2, “Unicode 字符集一般特征”,总结了 MySQL 支持的 Unicode 字符集的一般特征。

表 12.2 Unicode 字符集一般特征

Character Set Supported Characters Required Storage Per Character
utf8mb3, utf8 (deprecated) BMP 只有 1, 2 或 3 个字节
ucs2 BMP 只有 2 个字节
utf8mb4 BMP 和补充字符 1, 2, 3 或 4 个字节
utf16 BMP 和补充字符 2 或 4 个字节
utf16le BMP 和补充字符 2 或 4 个字节
utf32 BMP 和补充字符 4 个字节

超出 BMP 的字符将被比较为 REPLACEMENT CHARACTER,在转换到支持只包含 BMP 字符的 Unicode 字符集 (utf8mb3ucs2) 时转换为 '?'

如果您使用支持补充字符的字符集,因此比 BMP 只包含的 utf8mb3ucs2 字符集“更宽”,可能会出现不兼容问题;见第 12.9.8 节,“从 3 个字节到 4 个字节 Unicode 字符集之间转换”。该节还描述了如何将表从 (3 个字节) utf8mb3 转换到 (4 个字节) utf8mb4,并且可能会出现什么限制。

大多数 Unicode 字符集都有相似的排序规则,例如,每个字符集都有丹麦排序规则,名称分别是 utf8mb4_danish_ciutf8mb3_danish_ci(已弃用),utf8_danish_ci(已弃用),ucs2_danish_ciutf16_danish_ciutf32_danish_ci。唯一的例外是 utf16le,它只有两个排序规则。关于 Unicode 排序规则和它们的不同特性,包括补充字符的排序规则,请参见第12.10.1节,“Unicode 字符集”

MySQL 对 UCS-2、UTF-16 和 UTF-32 的实现将字符存储在大端字节顺序中,不使用值开头的字节顺序标记(BOM)。其他数据库系统可能使用小端字节顺序或 BOM。在这种情况下,需要在 MySQL 和这些系统之间传输数据时进行值转换。UTF-16LE 的实现是小端字节顺序。

MySQL 对 UTF-8 值不使用 BOM。

使用Unicode通信的客户端应用程序应该设置相应的客户端字符集(例如,通过执行SET NAMES 'utf8mb4'语句)。一些字符集不能用作客户端字符集。使用SET NAMESSET CHARACTER SET语句时,会产生错误。详见不允许的客户端字符集.

以下部分提供了 MySQL 中 Unicode 字符集的详细信息。