Unicode标准包括来自基本多语言平面(BMP)的字符和位于BMP之外的补充字符。本节介绍MySQL中对Unicode的支持。有关Unicode标准本身的信息,请访问Unicode Consortium网站。
BMP字符具有以下特征:
- 它们的代码点值在0到65535(或
U+0000和U+FFFF)之间。 - 它们可以使用8位,16位或24位(1到3个字节)以可变长度编码进行编码。
- 它们可以使用16位(2字节)以固定长度编码进行编码。
- 它们足以应付主要语言中的几乎所有字符。
补充字符位于BMP之外:
- 它们的代码点值在
U+10000和之间U+10FFFF。 - Unicode对补充字符的支持要求字符集的范围超出BMP字符,因此比BMP字符占用更多的空间(每个字符最多4个字节)。
根据RFC 3629实现了用于对Unicode数据进行编码的UTF-8(具有8位单位的Unicode转换格式)方法,该方法描述了从一到四个字节的编码序列。UTF-8的思想是使用不同长度的字节序列对各种Unicode字符进行编码:
- 基本的拉丁字母,数字和标点符号使用一个字节。
- 大多数欧洲和中东脚本字母均以2字节的顺序排列:扩展的拉丁字母(带有波浪号,马克龙,尖刻,重音和其他重音),西里尔字母,希腊语,亚美尼亚语,希伯来语,阿拉伯语,叙利亚语等。
- 韩文,中文和日文表意文字使用3字节或4字节序列。
MySQL支持以下Unicode字符集:
utf8mb4:Unicode字符集的UTF-8编码,每个字符使用1-4个字节。utf8mb3:Unicode字符集的UTF-8编码,每个字符使用一到三个字节。utf8:的别名utf8mb3。ucs2:Unicode字符集的UCS-2编码,每个字符使用两个字节。utf16:Unicode字符集的UTF-16编码,每个字符使用两个或四个字节。像,ucs2但扩展了辅助字符。utf16le:Unicode字符集的UTF-16LE编码。就像utf16小端而不是大端。utf32:Unicode字符集的UTF-32编码,每个字符使用四个字节。
注意该
utf8mb3字符集已被弃用,并将在将来的MySQL版本中删除。请utf8mb4改用。尽管utf8目前是的别名utf8mb3,但在某些时候utf8会成为对utf8mb4。为避免对的含义含糊不清utf8,请考虑utf8mb4为字符集引用而不是显式指定utf8。
表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字符(utf8mb3或ucs2)的Unicode字符集时转换为。
如果您使用支持增补字符,因此是字符集“宽”比BMP-只utf8mb3和ucs2字符集,也有你的应用程序潜在的不兼容问题;请参见“在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归类及其区分属性(包括补充字符的归类属性)的信息,请参见“ Unicode字符集”。
UCS-2,UTF-16和UTF-32的MySQL实现以大端字节顺序存储字符,并且在值的开头不使用字节顺序标记(BOM)。其他数据库系统可能使用低位字节序或BOM。在这种情况下,在这些系统和MySQL之间传输数据时将需要执行值的转换。UTF-16LE的实现是低端的。
MySQL对UTF-8值不使用BOM。
使用Unicode与服务器通信的客户端应用程序应相应地设置客户端字符集(例如,通过发出一条SET NAMES 'utf8mb4'语句)。某些字符集不能用作客户端字符集。尝试将它们与一起使用SET NAMES或SET CHARACTER SET产生错误。请参阅不允许的客户字符集。
以下各节提供了有关MySQL中Unicode字符集的更多详细信息。
