model → compare models 总是灰色或比不出东西,是因为该功能仅在已打开 .ndm 文件且处于模型编辑器界面时启用;若从主界面直连数据库或当前为sql/数据视图,则禁用;且必须先打开一个模型再通过菜单选择第二个,不可双文件拖拽比对。

Navicat 本身不支持多人实时协作生成差异脚本——所谓“协作”只是各自本地操作后手动比对,真要精准,必须绕开它的协同幻觉,回归文件与流程管控。
为什么 Model → Compare Models 总是灰色或比不出东西
这个菜单项只在「已打开 .ndm 模型文件」且当前焦点在模型编辑器界面时才启用。从 Navicat 主界面直接连数据库、或当前标签页是 SQL 查询/表数据视图,Model → Compare Models 就永远禁用。更关键的是:.ndm 文件之间无法直连比对,必须先打开一个,再通过该菜单选择第二个——这不是入口藏得深,而是功能根本没设计成双文件拖拽式比对。
常见误操作包括:
- 双击两个 .ndm 文件分别打开,以为能自动联动比对
- 在连接列表里右键数据库选“比较”,结果弹出的是结构同步而非模型比对
- 未检查符号标准:一个用 Crow’s Foot,一个用 IDEF1X,外键关系直接被忽略,字段名相同也判为“无变更”
比对前必须手动清洗的三项隐性差异
Navicat Data Modeler 的比对引擎对元数据语义极其敏感,哪怕肉眼看起来一模一样,也可能因底层定义不一致导致空比对或大量误报。
- 清除不可见字符:零宽空格(U+200B)、全角空格、BOM 头——这些在文本编辑器里不可见,但
name VARCHAR(50)和name VARCHAR(50)(末尾带零宽)会被识别为两个不同字段 - 统一符号标准:打开两个模型后,分别进
Model → Options → Notation,确认都设为 Crow’s Foot 或都设为 IDEF1X;混用会导致主外键连线丢失、约束不匹配 - 校验 information_schema 字符集:若模型来自逆向工程,两次导出源库必须使用相同字符集(如均为
utf8mb4),否则字段注释被截断或乱码,会被识别为“描述变更”而非“未变更”
导出 SQL 脚本时 Options 里三个必调开关
点击 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(PostgreSQL/SQL Server)。
真正影响上线的细节常被跳过
脚本看着完整,执行却失败,最典型的问题不在 Navicat 界面里,而在它不提示的地方:
- MySQL 5.7 环境下,Navicat 自动生成的
COLLATE=utf8mb4_0900_ai_ci会直接报错,必须手动替换为COLLATE=utf8mb4_unicode_ci - 同步含数据的表前,Navicat 不做任何数据备份提示,也不拦截
DROP COLUMN或MODIFY COLUMN类高危操作 - PostgreSQL 对
NOT NULL字段添加要求提供DEFAULT值,而 MySQL 可能静默失败,脚本里不会标注这种兼容性风险
所以别信“一键生成”,重点永远在人工 review:把脚本粘贴进 SQL 编辑器,逐条看 ALTER TABLE ... DROP COLUMN、ALTER TABLE ... MODIFY 是否涉及线上有数据的列——这才是精准与否的分水岭。











