Navicat结构比对SQL执行报错主因是目标库实际版本与Navicat误判版本不一致,需执行SELECT VERSION()和@@version_comment确认真实版本,再在同步向导高级选项中手动设Compatibility Mode为对应版本(如MySQL 5.7),并用“运行SQL文件”方式执行UTF-8无BOM格式脚本。

Navicat结构比对生成的SQL执行报错,基本不是你漏看了提示,而是它生成时就踩中了目标库的实际限制——版本、权限、字符集、SQL模式这四块最容易掉坑。
查清目标库真实版本,别信 Navicat 连接面板上写的
Navicat 在连接建立时拿到的版本号可能被代理、RDS 中间件或缓存污染。必须亲自连上目标库执行:
-
SELECT VERSION();—— 看主版本,比如5.7.42或8.0.33 -
SELECT @@version_comment;—— 看有没有云厂商定制标识,例如MySQL Community Server (Aliyun),这类实例常阉割新特性
如果 VERSION() 返回 5.7.42,但 Navicat 连接属性里写的是 8.0.33,那所有同步脚本都默认按 8.0 生成,必然在 5.7 上报 ERROR 1064。
盯住几个高危语法点,全局搜索就能快速定位
打开生成的 SQL 文件,在 VS Code 或 Notepad++ 里直接搜以下关键词(目标库是 MySQL 5.7 或更低时,出现任意一个基本就是根源):
-
utf8mb4_0900_ai_ci或utf8mb4_0900_as_cs→ 5.7 不识别,必须替换成utf8mb4_unicode_ci -
CREATE OR REPLACE VIEW→ 5.7 只支持DROP VIEW IF EXISTS+CREATE VIEW -
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP→ 5.7 仅允许一个CURRENT_TIMESTAMP,第二个得删掉 -
ALGORITHM=INSTANT、LOCK=NONE、JSON_OBJECT()默认值 → 全是 8.0.12+ 特性,低版本直拒
必须手动调低 Navicat 同步向导里的兼容性模式
Navicat 16+ 的「结构同步」向导中,那个关键开关藏得很深:
- 进同步设置 → 点「选项」→ 「高级」→ 找到
Compatibility Mode下拉菜单 - 明确选中目标库真实版本,比如
MySQL 5.7(不能留空,不能选“自动”)
这个选项生效后,Navicat 才会真正禁用 CREATE OR REPLACE、移除 ALGORITHM 子句、把 utf8mb4_0900_ai_ci 自动降级为 utf8mb4_general_ci。Navicat 15 及更早版没有该选项,只能手改 SQL 文件或升级客户端。
别用粘贴执行大脚本,必须用「运行 SQL 文件」并勾选 UTF-8
复制粘贴进查询编辑器执行,本质是客户端逐条解析+发送,大文件容易超时、BOM 头干扰、换行符丢失;而「运行 SQL 文件」走服务端直读,跳过客户端预检,成功率高得多。
务必勾选「使用 UTF-8 编码读取文件」,且确认 SQL 文件本身是 UTF-8 无 BOM 格式——用记事本另存为时右下角要显示「UTF-8」,不是「ANSI」或「UTF-8-BOM」。
真正容易被忽略的是:Navicat 导出 SQL 时若未指定兼容模式,它会按连接时“以为的版本”生成,而这个“以为”可能从第一次连接起就错了;一旦生成,再改也晚了——所以比对前先查版本、设兼容模式,比事后修 SQL 省十倍力气。











