Navicat同步SQL报错1064主因是版本不兼容:Navicat按当前连接版本生成语法(如MySQL 8.0的CREATE OR REPLACE VIEW、utf8mb4_0900_as_cs、ALGORITHM=INSTANT等),但目标库为低版本(如5.7)不支持。解决需查SELECT VERSION()确认目标版本,在同步向导高级设置中启用对应兼容模式(如选MySQL 5.7),强制降级语法;或手动用SHOW CREATE TABLE验证并精简语句。
Navicat 同步生成的 SQL 报错 ERROR 1064(语法错误)怎么定位版本问题
navicat 导出结构时默认按「当前连接的数据库版本」生成语法,但若目标库版本更低(比如 navicat 连的是 mysql 8.0,却往 mysql 5.7 同步),就会冒出 error 1064 (42000) 这类报错——不是你写错了,是 navicat 用了目标库不认的语法。
典型表现包括:
-
CREATE OR REPLACE VIEW:MySQL 5.7 不支持,只在 8.0+ 才可用 -
JSON类型字段带默认值如DEFAULT (JSON_OBJECT()):5.7 不解析函数默认值 -
utf8mb4_0900_as_cs校对规则:MySQL 8.0.1+ 引入,5.7 直接报错 Unknown collation -
ALGORITHM=INSTANT或LOCK=NONE子句:仅 8.0.12+ 支持,老版本直接拒识
验证方法很简单:在目标库执行 SELECT VERSION();,再比对 Navicat 连接该库时显示的「服务器版本」是否一致;若不一致,必须手动调低导出兼容级别。
如何让 Navicat 生成兼容旧版 MySQL 的 DDL
Navicat 16+ 在「数据传输」或「结构同步」向导里有隐藏的兼容性开关,不点开高级设置根本看不到。
操作路径:同步设置 → 高级 → 兼容性模式(Compatibility Mode)→ 选中对应目标版本,例如:
- 同步到 MySQL 5.7 → 选
MySQL 5.7 - 同步到 MariaDB 10.3 → 选
MariaDB 10.3 - 不确定目标版本?宁可选更低的,比如
MySQL 5.6,它生成的 SQL 至少能跑通 5.6–8.0 大部分场景
这个选项会强制 Navicat:
- 禁用
CREATE OR REPLACE,改用DROP + CREATE - 把
utf8mb4_0900_as_cs自动降级为utf8mb4_general_ci - 移除所有
ALGORITHM/LOCK显式子句 - 避免在
DEFAULT中使用函数表达式
为什么 SHOW CREATE TABLE 看着没问题,但 Navicat 同步仍失败
因为 Navicat 不是原样抄 SHOW CREATE TABLE 的结果——它会做语义重写,比如自动补全列定义、调整索引顺序、合并约束声明。一旦开启「自动依赖解析」或「优化 DDL 输出」,就可能引入目标库不支持的写法。
这时最可靠的兜底方式是:
- 在源库执行
SHOW CREATE TABLE `t_name`;,复制建表语句 - 在目标库手动执行一遍,确认无报错
- 若失败,逐段删减语句(先删
COMMENT、再删CHECK、最后删ENGINE=InnoDB ROW_FORMAT=DYNAMIC等可选参数)定位罪魁祸首 - 把最终能跑通的语句,粘贴进 Navicat 的「运行 SQL 文件」界面(不是右键连接处运行)
注意:COMMENT '中文' 在低版本可能因字符集声明缺失报错,务必确保建表语句开头有 DEFAULT CHARSET=utf8mb4。
同步前必须核对的三个隐性兼容点
有些兼容性问题不会立刻报错,但会导致后续行为异常,容易被忽略:
-
AUTO_INCREMENT值:Navicat 同步时若带AUTO_INCREMENT = 100,而目标表已有数据且最大 ID 是 200,插入新记录会冲突;建议同步后手动执行ALTER TABLE t AUTO_INCREMENT = (SELECT MAX(id)+1 FROM t) -
DEFINER用户:存储过程/事件导出时带DEFINER=`admin`@`%`,目标库若无该用户会静默失败或权限不足;同步前在目标库建好同名用户,或勾选「忽略 DEFINER」 -
GENERATED COLUMN:MySQL 5.7 支持,但 Navicat 15 及更早版本导出时可能漏掉STORED关键字,导致 5.7 解析失败;检查导出 SQL 中是否完整包含AS (expr) STORED
版本兼容不是“能跑就行”,而是“跑得稳、不埋雷”。尤其跨大版本(如 5.7 → 8.0 或反向)时,别信 Navicat 默认设置,每个 CREATE 和 ALTER 都值得扫一眼关键子句是否在目标环境被支持。











