ERROR 1273 (HY000):Unknown collation 是因 MySQL 8.0 备份文件含 utf8mb4_0900_ai_ci 等高版本排序规则,目标库为 5.7 或更低版本不支持;需替换 collation、禁用 Navicat “Use same charset”、删 SET NAMES、手动验证 information_schema 字符集。
还原时提示 ERROR 1273 (HY000):Unknown collation 是字符集不匹配
navicat 执行 sql 文件还原时突然中断,报错信息里带 error 1273 (hy000) 和类似 unknown collation 'utf8mb4_0900_ai_ci' 的内容——这说明备份文件里用了高版本 mysql(8.0+)的排序规则,而目标库是 5.7 或更低版本,不认这个 collation。
实操建议:
- 打开 SQL 备份文件,用文本编辑器搜索
utf8mb4_0900_ai_ci、utf8mb4_0900_as_cs等 8.0 特有 collation,替换成目标库支持的,比如utf8mb4_unicode_ci或utf8mb4_general_ci - 如果备份文件由 MySQL 8.0 的
mysqldump --set-gtid-purged=OFF生成,默认会带COLLATE子句;还原前加--skip-set-charset重导一次更省事 - Navicat 自带的「运行 SQL 文件」功能不会自动做 collation 降级适配,别指望它智能转换
用 Navicat「数据传输」比「运行 SQL 文件」更稳但要关掉 Use same charset
直接执行大 SQL 文件容易因字符集声明冲突失败,尤其跨版本迁移时。「数据传输」功能走的是 INSERT + 字段映射路径,绕开了 CREATE TABLE 语句里的 collation 声明,天然容错更强。
实操建议:
- 在「数据传输」向导里,到「高级」页,务必取消勾选
Use same charset—— 否则 Navicat 会强行把源库字符集(如utf8mb4)原样写进目标表定义,哪怕目标库默认是latin1 - 手动为目标库设置好默认字符集:连上目标库后,执行
ALTER DATABASE `dbname` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 如果表里已有乱码数据,传输前先确认源库连接的
character_set_client和collation_connection是一致的,否则 Navicat 可能误判编码
SET NAMES 在 SQL 文件开头没用,Navicat 不按它执行
有人在 SQL 备份文件最前面加 SET NAMES utf8mb4; 想统一连接层编码,结果还原后还是乱码或报错。因为 Navicat 的「运行 SQL 文件」功能不模拟真实客户端连接行为,SET NAMES 这类会话级命令被忽略,或只对后续部分语句生效,无法影响 CREATE TABLE 中的 collation 解析。
实操建议:
- 删掉 SQL 文件开头所有
SET NAMES、SET CHARSET、SET collation_connection行——它们在这里纯属干扰项 - 真正起作用的是 Navicat 连接配置里的「字符集」下拉框,必须设为和目标库一致(比如
utf8mb4),而不是依赖 SQL 里的 SET 语句 - 如果目标库是 MySQL 5.7,连接字符集选
utf8反而更安全,避免utf8mb4被错误解释成 8.0 特性
还原后查 information_schema.COLUMNS 验证实际字符集是否落地
界面显示“执行成功”不等于字段真用了你想要的字符集。Navicat 可能跳过某些 ALTER COLUMN 操作,或因权限不足静默失败,导致字段仍是 latin1_swedish_ci,但数据看着“好像没乱”——那是侥幸,不是正确。
实操建议:
- 还原完立刻执行:
SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_db' AND DATA_TYPE IN ('varchar', 'text', 'char'); - 重点核对
CHARACTER_SET_NAME是否为预期值(如utf8mb4),且COLLATION_NAME不含_0900_字样 - 如果发现个别字段没变,不要重新全量还原,用
ALTER TABLE `t` MODIFY `c` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;单独修正
字符集问题最难缠的地方不在还原过程,而在还原后没人去查 information_schema —— 看似正常的数据,可能已经埋了隐式转换、索引失效、JOIN 错位的坑。










