调整实例character_set_server参数和collation_server参数

在数据库迁移、数据库合并时,如果遇到数据库字符集和字符排序规则不兼容的情况,或者配套的应用程序有特殊的字符集和字符排序规则要求,您可以通过调整实例的character_set_server参数和collation_server参数,来修改字符集和字符排序规则,以满足实际需求。

背景信息

在MySQL中,character_set_server参数用于配置实例默认使用的字符集;collation_server用于配置字符集的排序规则。

同一个字符集可以使用不同的排序规则。例如,utf8字符集可以使用utf8_general_ciutf8_bin排序规则;latin1字符集可以使用latin1_general_cilatin1_bi 排序规则。这些排序规则决定了如何对字符进行比较和排序。

collation_server参数的值对应一种排序规则,例如utf8_binutf8_general_ci 。排序规则可以分为两种类型:基于二进制的排序和基于语言的排序。

  • 基于二进制的排序规则,会直接比较字符的二进制值,不考虑字符的语言语境和大小写。例如utf8_bin排序规则中, a和A的二进制值不同,它们被认为是不同的字符,并会按照它们的二进制值进行排序。基于二进制的排序规则通常执行比较快,但可能会出现不符合预期的排序结果。

  • 基于语言的排序规则,会考虑字符的语言语境和大小写。例如utf8_general_ci排序规则中,a和A被认为是相等的,从而会得出符合语言习惯的排序结果。

在MySQL中,排序规则是基于特定字符集的,因此character_set_servercollation_server是关联的。需要注意的是,不同的字符集支持不同的排序规则,不能随意地将任一排序规则与任一字符集组合使用,只有互相兼容的字符集和排序规则才能组合使用。

说明

在MySQL中,字符集utf8utf8mb3是别名关系,实际上指向同一个字符集。utf8mb3是为了兼容之前版本的MySQL,将utf8utf8mb4区分开来的别名。在MySQL 5.7及以后的版本中,建议使用utf8mb4字符集作为默认字符集,以便支持更多的字符。但是,在一些场景中,仍然需要使用utf8utf8mb3字符集,例如与旧代码或旧数据库进行兼容性测试。

character_set_servercollation_server参数中,都只支持您主动设置utf8,不支持设置utf8mb3

参数取值规则

  • 当仅修改character_set_server参数时,无论实例当前collation_server参数取值为何值,都会将其设置为character_set_server默认的collation_server取值。例如,将character_set_server配置为utf8时,系统会同时将collation_server的取值改为utf8_general_ci

    说明

    由于字符集utf8utf8mb3是别名关系,因此排序规则utf8_general_ciutf8mb3_general_ci是一样的。当您将character_set_server设置为utf8时,collation_server可能会被修改为utf8mb3_general_ci

  • 当仅修改collation_server参数时,系统会检查该参数取值与当前实例的character_set_server参数取值是否匹配。如果不匹配,则不允许修改collation_server参数。参数匹配关系请参见参数取值

  • 当同时修改character_set_servercollation_server参数时,会检查这两个参数取值的组合是否匹配,如果不匹配,则不允许修改这两个参数。参数匹配关系请参见参数取值

  • character_set_servercollation_server参数的取值只允许参数取值的表格中选择。

重要

当您创建或修改自定义参数模板时:

  • 仅选择character_set_server参数,对应的collation_server会使用默认值。

  • 同时选择character_set_servercollation_server时,需要确保参数组合满足取值规则。

参数取值

MySQL 8.0

参数默认值

character_set_server

collation_server

utf8

utf8_general_ci

参数匹配关系

说明

实例内核小版本为20200331及以上。

character_set_server

collation_server

是否是默认的collation_server

utf8

utf8_general_ci

utf8_bin

utf8_unicode_ci

utf8_unicode_520_ci

utf8_general_mysql500_ci

latin1

latin1_swedish_ci

latin1_bin

latin1_general_ci

latin1_general_cs

gbk

gbk_chinese_ci

gbk_bin

gb18030

gb18030_chinese_ci

gb18030_bin

gb18030_unicode_520_ci

utf8mb4

utf8mb4_0900_ai_ci

utf8mb4_0900_as_ci

utf8mb4_0900_as_cs

utf8mb4_0900_bin

说明

内核小版本为20200331(官方8.0.17)起开始支持。

utf8mb4_bin

utf8mb4_general_ci

utf8mb4_unicode_520_ci

utf8mb4_unicode_ci

MySQL 5.7

参数默认值

character_set_server

collation_server

utf8

utf8_general_ci

参数匹配关系

说明

实例内核小版本为20181226及以上。

character_set_server

collation_server

是否是默认的collation_server

utf8

utf8_general_ci

utf8_bin

utf8_unicode_ci

utf8_unicode_520_ci

utf8_general_mysql500_ci

latin1

latin1_swedish_ci

latin1_bin

latin1_general_ci

latin1_general_cs

gbk

gbk_chinese_ci

gbk_bin

gb18030

gb18030_chinese_ci

gb18030_bin

gb18030_unicode_520_ci

utf8mb4

utf8mb4_general_ci

utf8mb4_bin

utf8mb4_unicode_ci

utf8mb4_unicode_520_ci

MySQL 5.6

参数默认值

character_set_server

collation_server

utf8

utf8_general_ci

参数匹配关系

说明

实例内核小版本为20221130及以上。

character_set_server

collation_server

是否是默认的collation_server

utf8

utf8_general_ci

utf8_bin

utf8_unicode_ci

utf8_unicode_520_ci

utf8_general_mysql500_ci

latin1

latin1_swedish_ci

latin1_bin

latin1_general_ci

latin1_general_cs

gbk

gbk_chinese_ci

gbk_bin

utf8mb4

utf8mb4_general_ci

utf8mb4_bin

utf8mb4_unicode_ci

utf8mb4_unicode_520_ci

参考文档

MySQL官方文档: Character Set Configuration