## 10.9 Unicode 支持

[10.9.1 utf8mb4 字符集（4 字节 UTF-8 Unicode 编码）](charset-unicode-utf8mb4.html)
[10.9.2 utf8mb3 字符集（3 字节 UTF-8 Unicode 编码）](charset-unicode-utf8mb3.html)
[10.9.3 utf8 字符集（utf8mb3 的别名）](charset-unicode-utf8.html)
[10.9.4 ucs2 字符集（UCS-2 Unicode 编码）](charset-unicode-ucs2.html)
[10.9.5 utf16 字符集（UTF-16 Unicode 编码）](charset-unicode-utf16.html)
[10.9.6 utf16le 字符集（UTF-16LE Unicode 编码）](charset-unicode-utf16le.html)
[10.9.7 utf32 字符集（UTF-32 Unicode 编码）](charset-unicode-utf32.html)
[10.9.8 在 3 字节和 4 字节 Unicode 字符集之间转换](charset-unicode-conversion.html)

Unicode 标准包括来自基本多语言平面 (BMP) 的字符和位于 BMP 之外的补充字符。本节介绍 MySQL 中对 Unicode 的支持。有关 Unicode 标准本身的信息，请访问[Unicode 联盟网站](http://www.unicode.org/).

BMP 字符具有以下特点：

-   它们的代码点值介于 0 和 65535 之间（或`U+0000`和`U+FFFF`）。

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

-   它们可以使用 16 位（2 个字节）以固定长度编码进行编码。

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

    补充字符位于 BMP 之外：

-   它们的代码点值介于`U+10000`和`U+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 字符集一般特征”](charset-unicode.html#charset-unicode-charset-characteristics)，总结了 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 “更宽”`utf8mb3`和`ucs2`字符集，您的应用程序存在潜在的不兼容问题；看[第 10.9.8 节，“在 3 字节和 4 字节 Unicode 字符集之间转换”](charset-unicode-conversion.html).该部分还描述了如何将表从（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 字符集”](charset-unicode-sets.html).

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

MySQL 对 UTF-8 值不使用 BOM。

使用 Unicode 与服务器通信的客户端应用程序应相应地设置客户端字符集（例如，通过发出`设置名称'utf8mb4'`陈述）。某些字符集不能用作客户端字符集。尝试将它们与[`设置名称`](set-names.html)要么[`设置字符集`](set-character-set.html)产生错误。看[不允许的客户端字符集](charset-connection.html#charset-connection-impermissible-client-charset).

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