Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

12.9 Unicode 支持

Unicode 标准包括基本多语言平面 (BMP) 和补充字符,这些字符位于 BMP 之外。本节描述 MySQL 中的 Unicode 支持。有关 Unicode 标准本身的信息,请访问 Unicode Consortium 网站

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 字节序列表示:扩展拉丁字母(带有波浪号、宏、尖音符、重音符等)、西里尔字母、希腊字母、亚美尼亚字母、希伯来字母、阿拉伯字母、叙利亚字母等。

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

MySQL 支持以下 Unicode 字符集:

  • utf8mb4:使用 1 到 4 字节每个字符的 Unicode 字符集的 UTF-8 编码。

  • utf8mb3:使用 1 到 3 字节每个字符的 Unicode 字符集的 UTF-8 编码。该字符集已弃用,建议使用 utf8mb4

  • utf8utf8mb3 的弃用别名;建议使用 utf8mb4

    Note

    utf8 预计在未来 MySQL 版本中将成为 utf8mb4 的别名。

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

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

  • utf16le:Unicode 字符集的 UTF-16LE 编码。类似于 utf16,但小端序而不是大端序。

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

Note

utf8mb3 字符集已弃用,建议使用 utf8mb4utf8 目前是 utf8mb3 的别名,但它现在已弃用,预计将来 utf8 将成为 utf8mb4 的引用。MySQL 8.3 也将在信息模式表的列和 SQL SHOW 语句的输出中显示 utf8mb3,而不是 utf8

此外,您应该了解的是,在旧版本的 MySQL 中使用 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 不使用 BOM 来存储 UTF-8 值。

使用 Unicode 与服务器通信的客户端应用程序应该相应地设置客户端字符集(例如,通过发出 SET NAMES 'utf8mb4' 语句)。有一些字符集不能用作客户端字符集。尝试使用它们与 SET NAMESSET CHARACTER SET 将产生错误。请参阅 不可用的客户端字符集

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