Navicat结构同步需手动校验方向、忽略元数据噪音并干预SQL生成:源库(左侧)为待修改库,目标库(右侧)为基准库;COLLATE、COMMENT、DEFAULT引号等差异须逐条确认忽略;生成SQL需补分号、删FOREIGN_KEY_CHECKS、ENUM扩容应改用MODIFY COLUMN;HTML报告不可执行,须走同步向导生成SQL。

直接走 Tools → Structure Synchronization,但必须手动校验方向、忽略元数据噪音、干预 SQL 生成选项——Navicat 不会自动判断哪些“差异”该写进脚本,更不会帮你绕过 MySQL 的 ENGINE 或 COLLATE 锁表风险。
选错源和目标,ALTER 就全反了
结构同步不是双向 diff,它只生成「从源到目标」的单向变更。界面里不写“源/目标”,只标“数据库1”“数据库2”,极易点反:
- 左侧是你「要改的那个库」(比如
prod_v2025),右侧是「你想对齐的基准库」(比如dev_v2026) - 比对完成后,紧盯顶部状态栏:必须显示
将对 [prod_v2025] 应用以下更改,这才是正确方向 - 如果发现错了,别点
Next或运行,直接关掉窗口重来——已生成的 SQL 预览页不会提示方向错误
字段类型一样,但 COLLATE/COMMENT 不同,Navicat 仍标“修改”
MySQL 字段定义中,COLLATE utf8mb4_0900_as_cs 和 COLLATE utf8mb4_unicode_ci 被视为不同;COMMENT '用户昵称' 和 COMMENT '用户显示名' 也会触发黄色“修改”标记。这类差异通常不影响业务,但会生成无意义的 ALTER TABLE ... MODIFY COLUMN,可能锁表或引发隐式转换。
- 每条差异项都必须点开,切换到底部
DDL 比较标签,逐行核对CHARACTER SET、COLLATE、COMMENT、ENGINE - 确认是无关项后,右键该行 →
忽略此项;Navicat 不支持批量忽略,必须一条条点 - 特别注意
DEFAULT值里的引号:MySQL 认为DEFAULT '2023-01-01'和DEFAULT "2023-01-01"不同,勾选忽略默认值中的引号(在 Options 里)可避免误报
导出的 SQL 默认不能直接执行
点击 Generate SQL 后看到的脚本,表面完整,实则埋着三处硬伤:
- 默认不带分号结尾,直接粘贴进 MySQL 客户端会报
ERROR 1064;必须打开导出文件,全局替换\n为;\n,或在高级选项页勾选每条语句后添加分号 - 开头有
SET FOREIGN_KEY_CHECKS=0,若目标库存在ON UPDATE CASCADE级联约束,后续ALTER TABLE可能静默失败;建议手动删掉这两行,末尾补SET FOREIGN_KEY_CHECKS=1 -
ENUM字段新增值时,Navicat 生成的是MODIFY COLUMN全量重建,而非安全的CHANGE COLUMN;线上大表务必手动替换成ALTER TABLE t1 MODIFY COLUMN status ENUM('a','b','c','d') NOT NULL
HTML 报告 ≠ 可执行脚本
很多人在比对结果页点 Export as HTML,以为能拿到带 ALTER 的文档——其实它只是个只读快照,只列“源有/目标无”或“定义不一致”,不生成任何 DDL 语句。
- 需要落地变更?必须回到比对结果页,点
Next进入同步向导,再点Generate SQL - HTML 导出按钮藏在结果窗口右上角(图标是带箭头的方框),不是右键菜单里
- 中文乱码?提前在
Tools → Options → Environment → Default encoding改成UTF-8
真正卡住上线的,从来不是“有没有脚本”,而是 COLLATE 是否真要改、外键是否真要删、ENUM 扩容会不会锁表——这些 Navicat 不会替你决策,它只负责把两个 SHOW CREATE TABLE 的 diff 转成 SQL 字符串。


















