Navicat Premium不支持Git分支概念,其“结构同步”功能通过连接两个物理数据库(或不同schema)比对DDL差异并生成同步SQL,需人工限定范围、确保权限,并配合git diff等外部工具实现真正的分支级模型对比。

Navicat Premium 本身不支持“分支”概念,也没有 Git 式的数据库模型版本管理能力。所谓“不同分支开发库的数据模型对比”,本质是**对比两个物理数据库(或同一数据库中不同 schema)的结构定义**,比如 dev_v2 和 feature_order_refactor 这两个库。
你不需要找“分支对比”功能——它根本不存在。你需要的是「结构同步」+「人工界定对比范围」。
结构同步是唯一可行路径
Navicat 的 结构同步 功能(位于顶部菜单【工具】→【结构同步】)专为这种场景设计:它能提取两个数据库的 DDL(CREATE TABLE / ALTER TABLE 等),逐对象比对字段、索引、外键、注释等差异,并生成可执行的同步 SQL。
注意:它不读取 Git 分支名,也不解析 migration 文件;它只连真实数据库,读取当前 INFORMATION_SCHEMA 或系统视图。
- 必须确保两个目标库已分别配置为 Navicat 中的独立连接(如命名为
dev_branch和feature_branch) - 连接用户需有
SELECT权限访问INFORMATION_SCHEMA,否则会报错Access denied for user ... to database 'INFORMATION_SCHEMA' - 若使用 PostgreSQL,需确认用户有
USAGE权限在pg_catalog模式下,否则表字段类型可能显示为UNKNOWN
如何限定只比对特定 schema 或前缀表
Navicat 不支持正则或通配符过滤表名,但可通过以下方式控制范围:
- 在【结构同步】向导第二步,“选择要同步的对象”面板中,取消勾选不需要参与对比的库/模式(Schema)——例如只保留
public和order_service,忽略test_util - 若表按分支命名(如
t_user_dev、t_user_feature),需手动展开每个 schema,逐个取消勾选非目标表;无法用t_user_*一键筛选 - MySQL 下若启用了
lower_case_table_names=1,而源库表名大小写混用,Navicat 可能因元数据大小写不一致漏比对,建议统一小写建表
对比结果里哪些差异容易被忽略
生成的差异列表默认只显示 DDL 变更,但以下几类语义等价但语法不同的情况不会标为“不同”,需人工核验:
-
INT(11)vsINTEGER(MySQL 中等价,但 Navicat 视为相同类型) -
VARCHAR(255) COLLATE utf8mb4_0900_as_csvsVARCHAR(255) COLLATE utf8mb4_unicode_ci(排序规则不同,但 Navicat 可能不提示,除非显式勾选“比较排序规则”) - 外键约束名不同但引用关系一致(如
fk_user_dept_id→fk_usr_dept_id),Navicat 默认不比对约束名,只比对列映射 - PostgreSQL 中
GENERATED ALWAYS AS (...) STORED列,若源库未启用pg_stat_statements扩展,Navicat 可能无法读取表达式内容,显示为空
真正需要分支级模型对比时,该怎么做
如果你的流程依赖 Git 管理 DDL(如 Flyway migrations 或 Liquibase changelog),那么 Navicat 的结构同步只是最终验证手段,不是源头比对工具。
此时应:
- 用
git diff对比src/main/resources/db/migration/V20260801.01__add_order_status.sql等文件,确认逻辑意图 - 再用 Navicat 连上对应分支部署的数据库,跑一次
结构同步,验证迁移是否真正生效、有无隐式类型转换或权限遗漏 - 把 Navicat 导出的差异 SQL 保存为
navicat_sync_check_V20260801.sql,纳入 PR 附件供 Review
别指望 Navicat 理解你的分支策略;它只认得你连上的那两个数据库此刻长什么样。


















