必须勾选“比较所有记录”,否则Navicat仅校验主键存在性而忽略字段值差异;跨库比对需手动绑定匹配字段、统一字符集与时区、预处理JSON格式,并确认主键或唯一索引已存在。
数据对比必须勾选“比较所有记录”
默认只比主键存在性,字段值差异直接被忽略。点「工具 → 数据对比」后,在第二步配置页,务必手动勾选 比较所有记录。否则 navicat 只检查某条 id 在两边是否存在,不会比 name 或 updated_at 的值是否一致。
- 不勾选时,即使两行
id相同但email不同,也会显示“无差异” - 勾选后才真正逐字段比对,但性能下降明显,大数据量表建议先确认主键/唯一索引是否已建好
- 若表无主键或唯一索引,Navicat 会 fallback 到全字段比对(即把整行当字符串比),结果难读且易误判
跨库比对前必须手动绑定匹配字段
源库字段叫 user_id、目标库叫 uid?Navicat 不会自动映射,必须人工指定。进入对比流程后,点击对应表右侧的齿轮图标,在弹窗中把 user_id 和 uid 显式拖拽绑定——这是唯一能让跨名表正确对齐的方式。
- 字段类型不兼容(如 MySQL
DATETIMEvs PostgreSQLTIMESTAMP WITHOUT TIME ZONE)会导致整行标红,可在高级选项里取消勾选Compare timestamp with timezone - JSON 字段默认按字符串比对,
{"a":1,"b":2}和{"b":2,"a":1}会被判为不同;需提前用JSON_NORMALIZE()或jsonb_strip_nulls()统一格式 - SQL Server 的
uniqueidentifier和 MySQL 的CHAR(36)默认不标准化,大小写或连字符位置不同就会报差异
预览页里黄色高亮≠必须同步
点击表名后底部窗格显示的黄色字段,只是值不同,不等于业务上需要修正。比如 updated_at 字段因业务逻辑自动更新,实际数据语义一致,这类差异应右键 → 「排除此项」。
- 预览页显示「删除 N 行」,大概率是目标库有残留测试数据,不是源库删了,得人工确认是否该清理
- 「插入 0 行,更新 0 行,删除 N 行」说明目标库有多余行,但预览不告诉你这些行是否被
INSERT IGNORE跳过——要看同步完成后的日志页,找类似Duplicate entry '105' for key 'PRIMARY'的警告 - 预览不显示 WHERE 条件细节,无法区分「主键冲突跳过」和「字段值相同忽略」,只能靠日志反查
字符集与时区是静默杀手
界面不报错,但结果全乱:utf8mb4 和 utf8 字符集混用,相同中文可能被标为不同;TIMESTAMP 存 UTC vs 本地时间,时区偏移直接变成字段差异。
- 检查方式:在两边库执行
SHOW CREATE TABLE table_name,逐行比对CHARACTER SET和COLLATE - 时区问题更隐蔽:MySQL 的
@@time_zone和 PostgreSQL 的timezone参数要一致,否则NOW()写入值不同 - Oracle 的
ROWID是物理地址,不能用于跨库比对;若表无显式主键,Navicat 会直接报错No primary key or unique index found
SHOW CREATE TABLE 和翻日志才能定位。


















