navicat 17 不支持直接比对两个未打开的 .ndm 文件,compare models 功能仅在已加载一个模型并处于模型编辑器界面时激活;必须通过 file → open model 加载首个模型后,再执行 model → compare models 并手动选择第二个文件,且比对前需统一符号标准、清除不可见字符、确保源库字符集一致。

Navicat 17 不支持直接比对两个未打开的 .ndm 文件
这不是操作路径没找对,而是功能根本不存在。你双击打开两个模型、拖进同一窗口、甚至右键菜单里翻遍所有选项,Compare Models 都不会出现——因为该功能只在「已加载一个模型并处于模型编辑器界面」时才激活。菜单灰色?说明当前标签页不是模型视图,比如你正停在 SQL 查询页或连接列表页。
正确入口只有这一条:File → Open Model 加载第一个 .ndm 文件 → 确保焦点落在该模型标签页 → 再点 Model → Compare Models,此时对话框才会弹出,供你手动选择第二个 .ndm 文件。
比对前必须统一三项底层建模定义
即使菜单可用、文件能选,差异结果也大概率不准或为空。Navicat Data Modeler 的比对引擎对建模语义极其敏感,以下三点不一致,就等于拿两套语言互译:
- 符号标准必须完全相同:
Crow's Foot、IDEF1X、UML混用会导致外键关系直接被跳过,哪怕字段名一模一样 - 表名/字段名/约束名中不能含零宽空格、全角空格、BOM 头等不可见字符——这些在文本编辑器里看不见,但 Navicat 会判定为“不同对象”
- 若模型来自逆向工程,两次导出时源库的
information_schema字符集必须一致(如都是utf8mb4),否则字段注释乱码或截断,会被识别为“描述变更”
导出 SQL 脚本前必须手动勾选关键选项
点击 Compare Models 后弹出的窗口右下角有 Options 按钮,这里决定脚本是否可执行:
- 务必勾选
Generate DROP statements,否则删表、删字段、删索引不会生成对应语句 - 务必勾选
Preserve comments,否则字段注释只要差一个标点,就生成COMMENT ON COLUMN,而 MySQL 5.7 及更早版本根本不支持该语法 -
Use IF NOT EXISTS for CREATE statements可避免目标库已有对象时脚本中断,但注意 PostgreSQL 需 v12+ 才完整支持该语法在索引和约束上
导出的 SQL 默认无事务包装,如需原子执行,得手动加 START TRANSACTION 和 COMMIT(MySQL)或 BEGIN TRANSACTION(SQL Server/PostgreSQL)。
真正影响落地的三个盲区常被忽略
生成的脚本看起来完整,但执行时仍可能失败。最典型的三个问题:
- 脚本默认不包含
SET FOREIGN_KEY_CHECKS = 0,遇到外键依赖顺序错乱时直接报错 - 字段类型变更(如
VARCHAR(50)→VARCHAR(100))虽被识别,但 Navicat 不自动判断是否需要MODIFY COLUMN还是CHANGE COLUMN,MySQL 下写错会报语法错误 - 若某张表在第二个模型里被整体删除,但第一个模型中该表仍有外键被其他表引用,则生成的
DROP TABLE语句会因外键约束失败,且 Navicat 不提示依赖链
比对不是按下按钮就完事,它只输出“结构上差什么”,不回答“怎么安全改”。执行前必须人工核对字段类型兼容性、外键依赖顺序、以及目标库实际版本对语法的支持程度。











