在数据库迁移、数据库合并时,如果遇到数据库字符集和字符排序规则不兼容的情况,或者配套的应用程序有特殊的字符集和字符排序规则要求,您可以通过调整实例的character_set_server
参数和collation_server
参数,来修改字符集和字符排序规则,以满足实际需求。
背景信息
在MySQL中,character_set_server
参数用于配置实例默认使用的字符集;collation_server
用于配置字符集的排序规则。
同一个字符集可以使用不同的排序规则。例如,utf8
字符集可以使用utf8_general_ci
和utf8_bin
排序规则;latin1
字符集可以使用latin1_general_ci
和latin1_bi
排序规则。这些排序规则决定了如何对字符进行比较和排序。
collation_server
参数的值对应一种排序规则,例如utf8_bin
或utf8_general_ci
。排序规则可以分为两种类型:基于二进制的排序和基于语言的排序。
基于二进制的排序规则,会直接比较字符的二进制值,不考虑字符的语言语境和大小写。例如
utf8_bin
排序规则中, a和A的二进制值不同,它们被认为是不同的字符,并会按照它们的二进制值进行排序。基于二进制的排序规则通常执行比较快,但可能会出现不符合预期的排序结果。基于语言的排序规则,会考虑字符的语言语境和大小写。例如
utf8_general_ci
排序规则中,a和A被认为是相等的,从而会得出符合语言习惯的排序结果。
在MySQL中,排序规则是基于特定字符集的,因此character_set_server
和collation_server
是关联的。需要注意的是,不同的字符集支持不同的排序规则,不能随意地将任一排序规则与任一字符集组合使用,只有互相兼容的字符集和排序规则才能组合使用。
在MySQL中,字符集utf8
和utf8mb3
是别名关系,实际上指向同一个字符集。utf8mb3
是为了兼容之前版本的MySQL,将utf8
与utf8mb4
区分开来的别名。在MySQL 5.7及以后的版本中,建议使用utf8mb4
字符集作为默认字符集,以便支持更多的字符。但是,在一些场景中,仍然需要使用utf8
或utf8mb3
字符集,例如与旧代码或旧数据库进行兼容性测试。
在character_set_server
和collation_server
参数中,都只支持您主动设置utf8
,不支持设置utf8mb3
。
参数取值规则
当仅修改
character_set_server
参数时,无论实例当前collation_server
参数取值为何值,都会将其设置为character_set_server
默认的collation_server
取值。例如,将character_set_server
配置为utf8
时,系统会同时将collation_server
的取值改为utf8_general_ci
。说明由于字符集
utf8
和utf8mb3
是别名关系,因此排序规则utf8_general_ci
和utf8mb3_general_ci
是一样的。当您将character_set_server
设置为utf8
时,collation_server
可能会被修改为utf8mb3_general_ci
。当仅修改
collation_server
参数时,系统会检查该参数取值与当前实例的character_set_server
参数取值是否匹配。如果不匹配,则不允许修改collation_server
参数。参数匹配关系请参见参数取值。当同时修改
character_set_server
和collation_server
参数时,会检查这两个参数取值的组合是否匹配,如果不匹配,则不允许修改这两个参数。参数匹配关系请参见参数取值。character_set_server
和collation_server
参数的取值只允许参数取值的表格中选择。
当您创建或修改自定义参数模板时:
仅选择
character_set_server
参数,对应的collation_server
会使用默认值。同时选择
character_set_server
和collation_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。