10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册 本手册摘录

MySQL 8.0参考手册/....../ 3字节和4字节Unicode字符集之间的转换

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

本节介绍在转换字符数据之间可能面临的问题utf8mb3utf8mb4字符集。

笔记

这个讨论主要集中在utf8mb3utf8mb4,但类似的原则适用于转换之间ucs2字符集和字符集如UTF16.或者utf32

utf8mb3utf8mb4不同的字符集如下:

  • utf8mb3BMP (Basic Multilingual Plane)中仅支持字符。utf8mb4另外支持在BMP之外的补充字符。

  • utf8mb3每个字符最多使用三个字节。utf8mb4每种字符最多使用四个字节。

笔记

这个讨论是指的utf8mb3utf8mb4字符集名称要显式引用3字节和4字节UTF-8字符集数据。例外的是,在表定义中,use utf8使用,因为mysql转换了实例utf8mb3在此类定义中指定use utf8,这是一个别名utf8mb3

utf8mb3utf8mb4这是它使应用程序能够使用补充字符。一个权衡是,这可能会增加数据存储空间要求。

就表内容而言,从utf8mb3utf8mb4礼物没有问题:

  • 对于BMP字符,utf8mb4utf8mb3具有相同的存储特性:相同的代码值,编码相同,长度相同。

  • 对于补充字符,utf8mb4需要四个字节来存储它,而utf8mb3根本不能存储字符。当转换utf8mb3utf8mb4,您无需担心转换补充字符,因为没有。

就表结构而言,以下是主要的潜在不兼容性:

  • 对于可变长度字符数据类型(varchar.文本类型),字符的最大允许长度小于utf8mb4列而不是utf8mb3列。

  • 对于所有字符数据类型(字符varchar.,文本类型),可以索引的最大字符数较少utf8mb4列而不是utf8mb3列。

因此,转换表格utf8mb3utf8mb4,可能需要更改一些列或索引定义。

表可以从utf8mb3utf8mb4通过使用改变表。假设表格有此定义:

创建表t1 (col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, col2 CHAR(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL) CHARACTER SET utf8;

以下语句转换T1.使用utf8mb4

ALTER TABLE t1 DEFAULT CHARACTER SET utf8mb4, MODIFY col2 CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,修改col2 CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL

转换时的捕获utf8mb3utf8mb4是列或索引密钥的最大长度在方面不变字节。因此,它的方面较小人物因为字符的最大长度为四个字节而不是三个。为了字符varchar.,文本数据类型,当转换MySQL表时注意这些问题:

  • 检查所有定义utf8mb3列,并确保它们不超过存储引擎的最大长度。

  • 检查所有索引utf8mb3列,并确保它们不超过存储引擎的最大长度。有时,由于存储引擎的增强,最大值可能会发生变化。

如果上述条件适用,则必须减少定义的列或索引长度,或继续使用utf8mb3而不是utf8mb4

以下是一些可能需要进行结构调整的例子:

  • 一种非常小的文本串Column最多可以容纳255个字节,因此它最多可以容纳85个3字节或63个4字节字符。假设你有非常小的文本串列,使用utf8mb3但必须能够包含超过63个字符。你无法将它转换为utf8mb4除非您还将数据类型更改为更长的类型,例如文本

    类似地,一个很长的varchar.列可能需要更改为较长的列之一文本类型如果要将其转换为utf8mb3utf8mb4

  • Innodb.对于使用的表,最大索引长度为767字节袖珍的或者冗余行格式,所以utf8mb3或者utf8mb4列,可以分别索引最多255或191个字符。如果你现在有utf8mb3索引的列长于191个字符,必须索引较少数量的字符。

    在一个Innodb.使用的表袖珍的或者冗余行格式,这些列和索引定义是合法的:

    COL1 VARCHAR(500)字符集UTF8,索引(COL1(255))

    使用utf8mb4相反,索引必须更小:

    字符集utf8mb4,索引(col1(191))
    笔记

    为了Innodb.使用的表格压缩或者动态行格式,索引密钥前缀允许超过767个字节(最多3072个字节)。使用这些行格式创建的表可让您最多索引1024或768个字符utf8mb3或者utf8mb4分别列。相关信息请参见第15.22条,“InnoDB限制”,动态行格式

只有当您有很长的列或索引时,才最有可能需要上述类型的更改。否则,您应该能够将表从utf8mb3utf8mb4没有问题,使用改变表如前所述。

以下项目总结了其他潜在的不兼容性:

  • 设置名称“utf8mb4”导致使用用于连接字符集的4字节字符。只要从服务器发送任何4字节字符,就不会出现问题。否则,预计每个字符最多三个字节的应用可能可能存在问题。相反,期望发送4字节字符的应用程序必须确保服务器了解它们。

  • 为了复制,如果要在源上使用支持补充字符的字符集,则所有副本也必须了解它们。

    此外,请记住一般原则,如果表在源和副本上具有不同的定义,这会导致意外结果。例如,最大索引密钥长度的差异使得使用风险utf8mb3关于来源和utf8mb4在副本。

如果你已经转换为utf8mb4UTF16.UTF16LE., 或者utf32,然后决定转换回来utf8mb3或者ucs2(例如,要降级到旧版MySQL),这些考虑因素适用:

  • utf8mb3ucs2数据不会出现任何问题。

  • 服务器必须近来足以识别指定从您正在转换的字符集的定义。

  • 引用的对象定义utf8mb4字符集,可以将它们丢弃, mysqldump在下调之前,编辑转储文件以更改实例utf8mb4use utf8,并在旧服务器中重新加载文件,只要数据中没有4字节字符。旧的服务器看到use utf8在转储文件对象定义中并创建使用(3字节)的新对象use utf8字符集。