结构同步前必须确认MySQL版本兼容性:源库和目标库均需为MySQL 5.7+,建议统一为8.0+;须在同步向导“高级”中手动设置目标库实际版本,否则JSON、零日期、排序规则等特性会静默丢失或报错。
结构同步前必须确认MySQL版本兼容性
navicat 的结构同步不是“版本无感”的——mysql 5.6 和 8.0 混用时,json 字段、隐藏索引、角色权限、零日期处理等特性会静默丢失或报错。如果你看到生成的 sql 里漏了 generated always as 或 stored 关键字,大概率是 navicat 按低版本规则解析了高版本 ddl。
- 源库和目标库都需为 MySQL 5.7+(官方明确支持下限),强烈建议双方均为 8.0+,避免
datetime默认值引发Invalid default value for 'xxx' - 在同步向导的「选项」→「高级」中,必须手动设置「MySQL 版本」为目标库实际版本(如 8.0、8.4),否则 Navicat 默认按 5.7 生成语句
- 若源库含
utf8mb4_0900_as_cs排序规则,而目标库是 5.7(不支持该规则),同步会卡在“正在加载对象”或生成非法CONVERT TO语句
为什么生成的 SQL 在 MySQL 8.0+ 上执行报错?
最常见的是零日期问题:DEFAULT '0000-00-00 00:00:00' 在 MySQL 8.0 默认开启 NO_ZERO_DATE 模式下直接失败。这不是 Navicat bug,而是它没读取目标库的 SQL mode,仍按旧习惯写。
- 解决方法一:同步前,在「选项」→「高级」里把 MySQL 版本设为 8.0+,Navicat 会改用
CURRENT_TIMESTAMP或NULL替代零日期 - 解决方法二:预览 SQL 后,全局搜索
DEFAULT '0000-,替换成DEFAULT CURRENT_TIMESTAMP或删掉该子句(前提是业务允许) - 别依赖“自动修复”——Navicat 不校验目标库是否启用了
STRICT_TRANS_TABLES,这类模式下哪怕字段类型微调(如VARCHAR(100)→VARCHAR(191))也可能触发截断警告
跨版本同步时字段顺序和 ENUM 处理陷阱
Navicat 对字段顺序敏感,默认不勾选「忽略列顺序」时,哪怕只是调整了建表语句里字段顺序,也会生成一堆 DROP COLUMN + ADD COLUMN,线上大表执行可能锁表数分钟。
- 务必在「选项」中勾选
Ignore column order,避免误判 - ENUM 字段新增值时,Navicat 总是生成
MODIFY COLUMN(重建整列),而非安全的CHANGE COLUMN;大表务必手动改成ALTER TABLE t MODIFY COLUMN status ENUM('a','b','c','d') NOT NULL - MySQL 8.0 的
invisible index不会被同步——Navicat 当前版本(≤16.2)完全忽略该属性,同步后索引存在但不可见,需额外执行ALTER TABLE ... ALTER INDEX ... VISIBLE
同步方向反了会导致生产库字段被删
右键连接 →「结构同步」弹窗里,左面板是源(参考结构),右面板是目标(将被修改)。这个左右关系和你右键的是哪个连接无关——全看你在弹窗里手动拖拽或选择的顺序。
- 典型翻车场景:右键生产库连接打开结构同步,却把测试库拖到左边、生产库拖到右边,点「运行」等于主动删生产字段
- 预览 SQL 时重点扫三类语句:
DROP COLUMN、DROP FOREIGN KEY、DROP TABLE——只要出现,立刻停手,核对源/目标是否放反 - 「删除目标中不存在的对象」默认勾选,意味着目标库里多一张测试表,也会被删;线上环境务必取消该选项


















