MySQL报错1267或Unknown collation源于utf8mb4_0900_ai_ci与旧collation混用,必须通过INFORMATION_SCHEMA定位库表字段级差异,再用ALTER DATABASE、CONVERT TO及MODIFY逐级统一至utf8mb4_0900_ai_ci,列级硬编码需单独修正。

MySQL 8.0 升级后报 ERROR 1267 (HY000): Illegal mix of collations 或导入时卡在 Unknown collation: 'utf8mb4_0900_ai_ci',不是配置没生效,是旧表/列仍用 utf8mb4_general_ci(或 utf8mb4_unicode_ci),而新默认规则已变成 utf8mb4_0900_ai_ci,两者不能混用——必须手动对齐,不能靠重启或改 my.cnf 解决。
查清哪些对象还在用旧排序规则
别信建表语句里的注释或 phpMyAdmin 界面显示,得查 INFORMATION_SCHEMA:
SELECT TABLE_SCHEMA, TABLE_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_db' AND COLLATION_NAME != 'utf8mb4_0900_ai_ci';SELECT TABLE_NAME, COLUMN_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'your_db' AND COLLATION_NAME NOT IN ('utf8mb4_0900_ai_ci', NULL);- 执行
SHOW CREATE DATABASE your_db;和SHOW CREATE TABLE your_table;,确认是否显式写了旧规则
ALTER DATABASE + CONVERT TO 表级统一操作
仅改数据库默认值不会影响已有表;MODIFY 只改单列,CONVERT TO 才能批量重写整张表的字符集和排序规则:
- 先升级库级默认:
ALTER DATABASE `your_db` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; - 再逐表转换:
ALTER TABLE `your_table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;(注意是CONVERT TO,不是CHANGE或MODIFY) - 大表建议加超时保护:
SET SESSION innodb_lock_wait_timeout = 300;再执行
单独修正被硬编码的列级 collation
如果某列定义里写了 VARCHAR(50) COLLATE utf8mb4_general_ci,CONVERT TO 不会覆盖它,必须显式修正:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
ALTER TABLE `your_table` MODIFY `column_name` VARCHAR(50) COLLATE utf8mb4_0900_ai_ci;- 多个字段要分条执行,避免语法错误中断
- 有索引的字段改完后建议
ANALYZE TABLE your_table;更新统计信息
导入老版本 SQL 时遇到 Unknown collation 怎么办
从 MySQL 5.7 或 MariaDB 导出的 SQL,在 8.0 导入一般没问题;但反向操作(8.0 导出 → 导入到 5.7/MariaDB)必报错,因为 utf8mb4_0900_ai_ci 是 8.0 专属:
- 用
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' dump.sql全局替换(utf8mb4_unicode_ci兼容性比utf8mb4_general_ci更好) - 若导出文件含
COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'类错误,说明混用了utf8字符集别名,一并替换成utf8mb4 - 替换后务必检查
CREATE DATABASE和CREATE TABLE语句末尾的COLLATE是否已更新
最易被忽略的是:即使整个库设了新默认 collation,只要有一列还挂着旧规则,JOIN、FIND_IN_SET、子查询就可能突然报错。统一动作必须落到列级别,不能停在库或表层。










