mysql 8.0默认排序规则变为utf8mb4_0900_ai_ci,与旧版utf8mb4_general_ci等混用会导致error 1267;必须通过alter database、alter table convert to及modify列逐层统一collation,不可仅靠配置文件修改。

MySQL 8.0 默认排序规则已变,不手动改就会出错
MySQL 8.0 的默认排序规则是 utf8mb4_0900_ai_ci,而 5.7 或旧备份导入的表很可能还带着 utf8mb4_general_ci 或 utf8mb4_unicode_ci。两者混用在 FIND_IN_SET、JOIN、子查询等场景下直接报错:ERROR 1267 (HY000): Illegal mix of collations。这不是配置没生效,是 MySQL 8.0 强制校验排序规则一致性导致的——必须统一,不能靠“差不多就行”。
查清当前库/表/列的实际排序规则
别信 phpMyAdmin 界面显示或建表语句里的注释,得查 INFORMATION_SCHEMA:
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_db_name'
AND COLLATION_NAME NOT IN ('utf8mb4_0900_ai_ci');
常用检查命令:
-
SHOW CREATE DATABASE your_db_name;看库级COLLATE -
SHOW CREATE TABLE your_table;看表定义是否显式写了旧规则 -
SELECT @@collation_database, @@collation_server;看全局默认值
批量统一为 utf8mb4_0900_ai_ci 的安全操作步骤
不能只改配置文件重启就完事——已有对象的排序规则不会自动更新。必须分层执行:
- 先改数据库:执行
ALTER DATABASE `your_db_name` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; - 再改每张表:
ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;(注意是CONVERT TO,不是MODIFY) - 如果某字段被单独指定过旧排序规则(比如
VARCHAR(50) COLLATE utf8mb4_general_ci),需单独修正:ALTER TABLE `table_name` MODIFY `column_name` VARCHAR(50) COLLATE utf8mb4_0900_ai_ci; -
宝塔面板里通过 phpMyAdmin 执行时,建议单条运行,避免超时中断;大表提前加
SET SESSION innodb_lock_wait_timeout = 300;
跨版本导入时遇到“Unknown collation”错误怎么救
从 5.7 或更早导出的 SQL,在 MySQL 8.0 导入常卡在:Unknown collation: 'utf8mb4_unicode_520_ci' 或 COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'。这是 dump 文件里硬编码了旧规则,必须文本替换:
- 把所有
utf8mb4_unicode_520_ci替换为utf8mb4_0900_ai_ci - 把
CHARSET=utf8mb4 COLLATE=utf8_general_ci这类组合整行删掉,或改为COLLATE=utf8mb4_0900_ai_ci - 不要替换
DEFAULT CHARSET=utf8mb4——这个保留,只动COLLATE部分 - 用 VS Code 或 Sublime 批量替换,别用记事本,容易乱码
真正麻烦的是那些已经导入但排序规则混杂的生产环境——此时不能简单重导,得靠脚本逐表比对修复,且必须在低峰期操作,因为 CONVERT TO 会锁表。











