在数据库迁移、数据库合并时,如果遇到数据库字符集和字符排序规则不兼容的情况,或者配套的应用程序有特殊的字符集和字符排序规则要求,您可以通过调整实例的character_set_server
参数和collation_server
参数,来修改字符集和字符排序规则,以满足实际需求。
背景信息
character_set_server
参数用于设置实例的默认字符集,而collation_server
参数用于设置该字符集的排序规则。
同一个字符集可以有多种排序规则。例如,utf8
字符集支持utf8_general_ci
和utf8_bin
排序规则,latin1
字符集支持latin1_general_ci
和latin1_bin
排序规则。这些排序规则决定了字符的比较和排序方式。
排序规则分为两种类型:基于二进制和基于语言排序。
基于二进制的排序规则(如
utf8_bin
)直接比较字符的二进制值,不考虑语言语境和大小写。例如,a
和A
的二进制值不同,因此被视为不同的字符,并按其二进制值排序。这种排序方式速度快,但可能不符合语言习惯。基于语言的排序规则(如
utf8_general_ci
)会考虑字符的语言语境和大小写。例如,a
和A
被视为相等,从而生成符合语言习惯的排序结果。
在MySQL中,character_set_server
和collation_server
是相互关联的,因为排序规则是基于特定字符集的。需要注意的是,只有兼容的字符集和排序规则才能组合使用,不能随意搭配。
在MySQL中,字符集
utf8
和utf8mb3
是别名关系,实际上指向同一个字符集。utf8mb3
是为了与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
默认的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版本 | character_set_server | collation_server |
MySQL 8.0,MySQL 5.7,MySQL 5.6 | utf8 | utf8_general_ci |
参数匹配关系
内核小版本需满足:
MySQL 8.0:20200331及以上。
MySQL 5.7:20181226及以上。
MySQL 5.6:20221130及以上。
character_set_server | collation_server | 是否是默认的collation_server | 说明 |
utf8 | utf8_general_ci | 是 | MySQL 8.0、5.7和5.6参数匹配关系相同。 |
utf8_bin | 否 | ||
utf8_unicode_ci | 否 | ||
utf8_unicode_520_ci | 否 | ||
utf8_general_mysql500_ci | 否 | ||
latin1 | latin1_swedish_ci | 是 | MySQL 8.0、5.7和5.6参数匹配关系相同。 |
latin1_bin | 否 | ||
latin1_general_ci | 否 | ||
latin1_general_cs | 否 | ||
gbk | gbk_chinese_ci | 是 | MySQL 8.0、5.7和5.6参数匹配关系相同。 |
gbk_bin | 否 | ||
gb18030 | gb18030_chinese_ci | 是 | MySQL 8.0和5.7参数匹配关系相同。MySQL 5.6不支持gb18030。 |
gb18030_bin | 否 | ||
gb18030_unicode_520_ci | 否 | ||
utf8mb4 | utf8mb4_0900_ai_ci | 是 | 仅MySQL 8.0支持,5.7和5.6不支持。 |
utf8mb4_0900_as_ci | 否 | ||
utf8mb4_0900_as_cs | 否 | ||
utf8mb4_0900_bin | 否 | ||
utf8mb4_general_ci |
| 无 | |
utf8mb4_bin | 否 | MySQL 8.0、5.7和5.6参数匹配关系相同。 | |
utf8mb4_unicode_520_ci | 否 | ||
utf8mb4_unicode_ci | 否 |
参考文档
MySQL官方文档: Character Set Configuration。