Unknown collation错误源于MySQL版本不兼容:5.7及更早不支持utf8mb4_0900_as_cs等8.0+排序规则,需按目标版本替换为对应collation——5.7用utf8mb4_unicode_ci,5.6及更老则需降级为utf8+utf8_general_ci,并检查ROW_FORMAT、JSON字段和BOM头。
Unknown collation错误怎么快速定位
导入时弹出unknown collation: 'utf8mb4_0900_as_cs'或unknown collation: 'utf8mb4_0900_ai_ci',说明sql文件里用了目标mysql不认的排序规则。这不是编码问题,而是版本兼容性问题——mysql 5.7及更早版本压根没实现这些8.0+才引入的collation。
别急着全文件搜索替换。先确认目标库版本:SELECT VERSION();。结果是5.7.33就按5.7处理,5.6.40就得降级到utf8系,8.0.33则可能只需调低严格模式。
不同MySQL版本该换什么排序规则
盲目替换成utf8mb4_general_ci可能引发查询结果偏差(比如大小写、重音敏感行为不一致),必须按目标版本选最稳妥的替代项:
- 目标为 MySQL 5.7:统一替换
utf8mb4_0900_as_cs和utf8mb4_0900_ai_ci为utf8mb4_unicode_ci - 目标为 MySQL 5.6 或更老:必须同时做两件事——把所有
utf8mb4字符集改成utf8,再把排序规则换成utf8_general_ci - 若文件里混用
COLLATE和DEFAULT COLLATE两种写法,都要搜,例如:COLLATE utf8mb4_0900_as_cs和DEFAULT COLLATE utf8mb4_0900_as_cs
文本编辑器里怎么安全批量替换
用VS Code、Notepad++或Sublime Text打开SQL文件,启用正则模式(注意勾选“匹配大小写”和“匹配整个单词”):
- 查
utf8mb4_0900_as_cs→ 替换为utf8mb4_unicode_ci - 查
utf8mb4_0900_ai_ci→ 替换为utf8mb4_unicode_ci - 查
CHARSET=utf8mb4→ 若目标是5.6,替换为CHARSET=utf8(注意保留等号两边空格) - Linux/macOS可用
sed -i 's/utf8mb4_0900_as_cs/utf8mb4_unicode_ci/g' dump.sql,Windows PowerShell用(Get-Content dump.sql) -replace 'utf8mb4_0900_as_cs', 'utf8mb4_unicode_ci' | Set-Content dump.sql
修复后仍报错?检查这三个隐藏坑
排序规则替换完还失败,大概率是以下三处被忽略:
立即学习“PHP免费学习笔记(深入)”;
- 表选项里的
ROW_FORMAT=DYNAMIC——MySQL 5.6默认支持,但若innodb_file_format被设为Antelope就会拒绝,删掉整段ROW_FORMAT=...更保险 - JSON字段定义如
data JSON DEFAULT (JSON_OBJECT())——5.7才支持JSON类型,5.6必须改成TEXT并删掉DEFAULT子句 - 文件开头有BOM头(尤其Windows记事本保存过)——会导致第一行
CREATE TABLE被识别为乱码,用编辑器“以UTF-8无BOM格式保存”重存一遍
真正麻烦的不是替换本身,而是同一份SQL文件里可能混着多个版本特性:一个表用utf8mb4_0900_as_cs,另一个表带JSON字段,第三个表又启用了STORED GENERATED COLUMN。得逐块检查CREATE TABLE语句,不能只靠全局替换蒙混过关。



















