# 10.9 Unicode 支持

10.9.1 utf8mb4 字符集(4 字节 UTF-8 Unicode 编码)

10.9.2 utf8mb3 字符集(3 字节 UTF-8 Unicode 编码)

10.9.3 utf8 字符集(utf8mb3 的别名)

10.9.4 ucs2 字符集(UCS-2 Unicode 编码)

10.9.5 utf16 字符集(UTF-16 Unicode 编码)

10.9.6 utf16le 字符集(UTF-16LE Unicode 编码)

10.9.7 utf32 字符集(UTF-32 Unicode 编码)

10.9.8 在 3 字节和 4 字节 Unicode 字符集之间转换

Unicode 标准包括来自基本多语言平面 (BMP) 的字符和位于 BMP 之外的补充字符。本节介绍 MySQL 中对 Unicode 的支持。有关 Unicode 标准本身的信息,请访问Unicode 联盟网站 (opens new window).

BMP 字符具有以下特点:

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

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

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

  • 它们对于主要语言中的几乎所有字符都足够了。

    补充字符位于 BMP 之外:

  • 它们的代码点值介于U+10000U+10FFFF)。

  • Unicode 对补充字符的支持要求字符集的范围超出 BMP 字符,因此占用的空间比 BMP 字符多(每个字符最多 4 个字节)。

    用于编码 Unicode 数据的 UTF-8(具有 8 位单元的 Unicode 转换格式)方法是根据 RFC 3629 实现的,它描述了占用一到四个字节的编码序列。UTF-8 的思想是使用不同长度的字节序列对各种 Unicode 字符进行编码:

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

  • 大多数欧洲和中东脚本字母适合 2 字节序列:扩展拉丁字母(带有波浪号、长音符号、锐音、重音和其他口音)、西里尔文、希腊文、亚美尼亚文、希伯来文、阿拉伯文、叙利亚文等。

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

    MySQL 支持这些 Unicode 字符集:

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

  • utf8mb3: Unicode 字符集的 UTF-8 编码,每个字符使用一到三个字节。

  • utf8: 的别名utf8mb3.

  • ucs2: Unicode 字符集的 UCS-2 编码,每个字符使用两个字节。在 MySQL 8.0.28 中已弃用;您应该期望在未来的版本中删除对这个字符集的支持。

  • utf16: Unicode 字符集的 UTF-16 编码,每个字符使用两个或四个字节。喜欢ucs2但带有补充字符的扩展名。

  • utf16le:Unicode 字符集的 UTF-16LE 编码。喜欢utf16但小端而不是大端。

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

笔记

utf8mb3不推荐使用字符集,您应该期望它在未来的 MySQL 版本中被删除。请用utf8mb4反而。utf8目前是一个别名utf8mb3, 但它现在已被弃用,并且utf8预计随后将成为参考utf8mb4.从 MySQL 8.0.28 开始,utf8mb3也显示在utf8在信息模式表的列中,以及在 SQL 的输出中显示陈述。

为了避免含义模糊utf8,考虑指定utf8mb4明确地用于字符集引用。

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

表 10.2 Unicode 字符集一般特征

字符集 支持的字符 每个字符所需的存储空间
utf8mb3, utf8 仅 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 字符集时(utf8mb3要么ucs2)。

如果您使用支持补充字符的字符集,因此比 BMP-only “更宽”utf8mb3ucs2字符集,您的应用程序存在潜在的不兼容问题;看第 10.9.8 节,“在 3 字节和 4 字节 Unicode 字符集之间转换”.该部分还描述了如何将表从(3 字节)utf8mb3到(4字节)utf8mb4,以及这样做可能会应用哪些限制。

大多数 Unicode 字符集都可以使用类似的排序规则集。例如,每个都有一个丹麦排序规则,其名称是utf8mb4_danish_ci,utf8mb3_danish_ci,utf8_danish_ci,ucs2_danish_ci,utf16_danish_ci, 和utf32_danish_ci.例外是utf16le,它只有两个排序规则。有关 Unicode 排序规则及其区分属性(包括补充字符的排序规则属性)的信息,请参阅第 10.10.1 节,“Unicode 字符集”.

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

MySQL 对 UTF-8 值不使用 BOM。

使用 Unicode 与服务器通信的客户端应用程序应相应地设置客户端字符集(例如,通过发出设置名称'utf8mb4'陈述)。某些字符集不能用作客户端字符集。尝试将它们与设置名称要么设置字符集产生错误。看不允许的客户端字符集.

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