navicat 16 不支持跨平台(如 mysql ↔ postgresql、mysql ↔ sql server)的结构或数据自动比对,必须手动配置字段映射、关闭默认忽略选项、确保显式声明字符集与约束,且所有比对均依赖主键/唯一键严格匹配,不进行语义推断或类型智能转换。
navicat 16 能做跨平台结构与数据对比,但必须手动绕过默认限制——它不自动推断字段映射、不兼容隐式类型转换、也不校验目标库语法,所有关键配置都得显式指定,否则比对失败或结果错漏。
结构同步:MySQL ↔ PostgreSQL 表结构差异怎么真比出来?
Navicat 默认跳过 TEXT/BLOB 字段的字符集、默认值、NULL 约束等细节,跨平台时尤其容易漏掉关键差异(比如 MySQL 的 TEXT NOT NULL 和 PostgreSQL 的 TEXT 不带约束)。
- 打开「结构同步」窗口 → 点击右下角
Options→ 取消勾选:Ignore TEXT/BLOB column attributes、Ignore column default value、Ignore column character set - 确认两边表定义中,TEXT 类型字段是否显式声明了
CHARACTER SET(Navicat 不继承表级默认值,只比对显式声明) - 若 PostgreSQL 表用
citext或 MySQL 用utf8mb4_0900_as_cs排序规则,需在Compare Options中禁用Ignore column collation,否则大小写敏感性差异会被忽略 - 跨平台时引擎/存储参数无意义(如 MySQL 的
ENGINE=InnoDBvs PG 的STORAGE),但必须勾选Compare table options才能暴露ROW_FORMAT、AUTO_INCREMENT等实际影响行为的项
数据对比:MySQL 和 SQL Server 表怎么按主键对齐?
Navicat 不支持字段名自动匹配。源库叫 id、目标库叫 user_id,即使类型都是 BIGINT,不手动绑定就无法开始比对,会直接报错 No primary key or unique index found。
- 进入「工具 → 数据对比」→ 勾选「允许跨连接比较」→ 分别选好两个连接(如
mysql_prod和sqlserver_staging) - 点击「添加表映射」→ 显式配对源表
users↔ 目标表dbo.users - 对每张表点击右侧齿轮图标 → 在「匹配条件」中,手动把源字段
id拖拽绑定到目标字段user_id(不能只靠名字相同) - SQL Server 连接属性中务必勾选
Use Unicode,否则含中文的NVARCHAR字段可能被截断或解析为空,导致整行比对失效 - 若时间字段是
DATETIME2(3)vsTIMESTAMP,取消勾选Compare timestamp with timezone,避免毫秒精度或时区偏移被误判为变更
对比卡死、报错或结果不准的三个硬坑
不是连接通了就能比;很多失败发生在元数据拉取或客户端内存比对阶段,且错误提示极不直观。
-
MySQL Error 2013: Lost connection:常见于超宽表(>100 列)+ 大文本字段,需调大 MySQL 服务端max_allowed_packet(建议 ≥64M),并在 Navicat 连接高级选项中启用「压缩协议」 - 对比界面卡在
Comparing columns…:大概率是目标库缺少SELECT或SHOW CREATE TABLE权限,尤其云数据库(如阿里云 RDS)需单独授权information_schema查询权限 - 同一行被标为「两边都新增」:说明未正确设置匹配字段,或某侧主键含
NULL值(MySQL 允许唯一索引含多个NULL,PostgreSQL 不允许),Navicat 无法对齐,此时必须补全非空约束或改用业务唯一键
跨平台对比真正落地的难点不在操作步骤,而在于字段语义一致性——Navicat 只做机械映射,不理解“user_id 就是 id”,也不判断 JSON 字段内容是否逻辑等价。你得先确保两边建模对齐,它才只是个执行器。











