# 10.9 Unicode 支持
10.9.1 utf8mb4 字符集(4 字节 UTF-8 Unicode 编码)
10.9.2 utf8mb3 字符集(3 字节 UTF-8 Unicode 编码)
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+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 字符集一般特征”,总结了 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 字符集之间转换”.该部分还描述了如何将表从(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 字符集的更多详细信息。