• 首页
  • css3教程
  • html5教程
  • jQuery手册
  • php7教程
  • MySQL手册
  • apache手册
  • 位置: MySQL8中文手册 -> MySQL字符集支持

    字符集Unicode

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

    BMP字符具有以下特征:

    • 它们的代码点值在0到65535(或U+0000U+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字符集的一般特征

    字符集支持的字符每个字符所需的存储量
    utf8mb3utf8仅BMP1、2或3个字节
    ucs2仅BMP2字节
    utf8mb4BMP和补充1、2、3或4个字节
    utf16BMP和补充2或4个字节
    utf16leBMP和补充2或4个字节
    utf32BMP和补充4字节

    BMP以外的字符将作为REPLACEMENT CHARACTER进行比较,并'?'在转换为仅支持BMP字符(utf8mb3ucs2)的Unicode字符集时转换为。

    如果您使用支持增补字符,因此是字符集“宽”比BMP-只utf8mb3ucs2字符集,也有你的应用程序潜在的不兼容问题;请参见“在3字节和4字节Unicode字符集之间转换”。该部分还描述了如何将表从(3字节)utf8mb3转换为(4字节)utf8mb4,以及在此过程中可能适用的约束。

    大多数Unicode字符集都可以使用类似的排序规则集。例如,每个具有丹麦归类,其中名称是utf8mb4_danish_ciutf8mb3_danish_ciutf8_danish_ciucs2_danish_ciutf16_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 NAMESSET CHARACTER SET产生错误。请参阅不允许的客户字符集。

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