MySQL升级后排序规则变化是比较常见的问题,不同版本的MySQL默认字符集和排序规则存在差异,比如5.7版本默认排序规则是utf8mb4_general_ci,而8.0版本默认是utf8mb4_0900_ai_ci,升级后原有对象的排序规则和新版本默认配置不一致就会引发各类问题。

排序规则变化引发的常见问题
升级后出现排序规则不匹配时,通常会有以下几类表现:
- 执行跨表查询或者关联查询时,提示排序规则不兼容的错误,比如
Illegal mix of collations报错 - 字符串排序结果和升级前不一致,比如中文排序顺序出现偏差
- 创建新表时如果不指定排序规则,会使用新版本默认配置,和原有表的排序规则不同,后续关联查询容易出错
- 导入原有数据备份时,因为排序规则不匹配导致导入失败
问题排查方法
首先需要确认当前数据库的默认排序规则,以及各个表、字段的排序规则配置,排查不匹配的对象。
查看全局默认排序规则
执行以下SQL可以查看当前MySQL实例的默认字符集和排序规则:
-- 查看全局字符集和排序规则配置 SHOW VARIABLES LIKE 'character_set_server'; SHOW VARIABLES LIKE 'collation_server';
查看指定数据库的排序规则
如果需要查看某个具体数据库的默认排序规则,可以执行:
-- 查看test_db数据库的排序规则,替换test_db为实际数据库名 SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'test_db';
查看表字段的排序规则
查看某个表所有字段的排序规则配置,可以执行:
-- 查看test_table表所有字段的排序规则,替换test_table为实际表名 SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'test_db' AND TABLE_NAME = 'test_table';
不同场景的Collation更新方法
单个表更新排序规则
如果只需要修改某个表的默认排序规则以及所有字符串字段的排序规则,可以执行以下操作:
-- 修改表的默认排序规则,同时转换所有字符串字段的排序规则为utf8mb4_general_ci ALTER TABLE test_db.test_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
如果只需要修改表的默认排序规则,不修改字段的排序规则,可以执行:
-- 仅修改表的默认排序规则,不影响已有字段 ALTER TABLE test_db.test_table CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
单个字段更新排序规则
如果只需要修改某个特定字段的排序规则,可以执行:
-- 修改test_table表中name字段的排序规则 ALTER TABLE test_db.test_table MODIFY COLUMN name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
整库更新排序规则
如果需要修改整个数据库下所有表的排序规则,可以先生成批量修改的SQL语句,再执行:
-- 生成整库所有表的排序规则修改语句,替换test_db为实际数据库名,替换目标排序规则
SELECT CONCAT(
'ALTER TABLE ',
TABLE_SCHEMA,
'.',
TABLE_NAME,
' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;'
) AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'test_db' AND TABLE_TYPE = 'BASE TABLE';
执行上述语句后会得到所有表的修改SQL,复制这些SQL批量执行即可完成整库的排序规则更新。
修改全局默认排序规则
如果希望后续新建的数据库、表默认使用指定的排序规则,需要修改MySQL的配置文件,然后重启服务:
在my.cnf或者my.ini配置文件中添加以下配置:
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci
修改完成后重启MySQL服务,新的默认排序规则就会生效。
注意事项
- 修改排序规则前一定要对数据库进行全量备份,避免操作失误导致数据丢失
- 如果表中存在大量数据,修改排序规则的操作会锁表,建议在业务低峰期执行
- 修改排序规则后需要验证所有相关业务查询是否正常,尤其是涉及字符串关联、排序、比较的逻辑
- 如果使用的是云数据库服务,部分全局配置可能无法直接修改,需要联系服务商或者查看对应平台的操作文档