直接还原高版本备份到低版本数据库必然失败,因SQL Server、MySQL等引擎层不向下兼容,须转脚本并手动适配语法、排序规则、默认值等。
直接还原高版本备份到低版本数据库必然失败,这不是 navicat 的 bug,而是数据库引擎层的硬性限制——sql server 不向下兼容 .bak,mysql / mariadb 之间或跨 mysql 大版本(如 8.0 → 5.7)会因语法、排序规则、默认值行为不一致而中断导入。
SQL Server 高版本 .bak 无法在低版本还原:必须转脚本
Navicat 点“还原”按钮执行的是 RESTORE DATABASE,而 SQL Server 2019(SoftwareVersionMajor = 15)生成的 .bak 在 2016(14)或 2012(11)上会报 Msg 3241, Level 16, State 7。别试权限、路径、单用户模式——版本不匹配时这些全无效。
- 右键源数据库 →
转储 SQL 文件→ 勾选「结构」和「数据」 - 在「选项」页中:必须勾选「兼容模式」并设为你的目标版本(如 SQL Server 2016),否则会导出
STRING_AGG、SEQUENCE等低版本不支持的语法 - 取消勾选「导出外键约束」:Navicat 默认按表名字母序建表,极易触发依赖顺序错误(如视图引用未创建的表);先建表+插数据,最后统一加外键更可靠
- 对含自增主键的表,手动在对应
INSERT前加SET IDENTITY_INSERT [table_name] ON,结束后加OFF
MySQL / MariaDB 跨版本还原失败:重点查排序规则与默认值
报错 ERROR 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci' 是最明确信号——说明你正把 MySQL 8.0+ 的备份往 5.7 或更低版本倒。这不是编码问题,是排序规则根本不存在。
- 用文本编辑器全局替换:所有
utf8mb4_0900_ai_ci→utf8mb4_unicode_ci(注意保留引号和分号) - 搜索
DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP:MySQL 5.6 及更早不支持,要么删掉,要么替换成具体时间字面量(如'2026-06-02') - 检查
CREATE TABLE语句末尾的ENGINE=InnoDB DEFAULT CHARSET=utf8mb4:若目标库是 MySQL 5.5,需降级为CHARSET=utf8 - 导入前执行
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';(填入 Navicat「运行 SQL 文件」窗口的「执行前运行自定义命令」框),临时绕过严格模式报错ERROR 1067
为什么“运行 SQL 文件”比粘贴执行更稳?
很多人把大 SQL 复制进查询窗口执行,结果卡住、断连、报错行号错位——这是因为粘贴执行走客户端解析+逐条发送,超时、缓冲区截断、编码错乱全可能发生。而「运行 SQL 文件」是服务端直读,跳过客户端限制。
- 务必使用右键连接 →
运行 SQL 文件,不是「新建查询」→ 粘贴 - 导入前勾选「使用 UTF-8 编码读取文件」,避免中文乱码
- 在 Navicat「工具 → 选项 → 连接 → MySQL」中,把「查询超时时间」设为
0(不限制) - 同步确认目标 MySQL 的
max_allowed_packet≥ 256M(改my.cnf并重启),否则大 BLOB 或长文本会静默截断
真正容易被忽略的是:Navicat 的「兼容模式」只影响结构导出,不处理数据内容里的隐式类型转换或权限上下文(如 DEFINER=`admin`@`%`)。一旦遇到 ERROR 1449,就得手动删掉或重写 DEFINER 子句——这点没有任何图形界面能自动帮你兜底。


















