Navicat 15「数据对比」真实比对两库数据差异,定位到表、行、字段级不同;需勾选“比较所有记录”,注意字符集、时区、主键配置影响结果准确性。
用「数据对比」功能直接看到哪几行不一致
navicat 15 的「数据对比」不是同步前的模拟,而是真实比对两个库中实际数据的差异。它能定位到具体表、具体行、甚至具体字段值的不同,比手动写 select ... except 快得多。
操作路径是:工具 → 数据对比,选好源库和目标库后,点击「下一步」。关键在第二步配置:必须勾选「比较所有记录」(默认可能只比主键),否则只会校验存在性,漏掉字段值差异。
- 若表无主键或唯一键,Navicat 会按全字段比对,速度慢且结果难读——提前加个
PRIMARY KEY或UNIQUE索引更稳 - 字符集不一致(如 utf8mb4 vs utf8)会导致相同字符串被标为「不同」,但界面不提示原因,需自己检查
SHOW CREATE TABLE - 时间字段(
TIMESTAMP/DATETIME)若含时区偏移,或一方存 UTC、一方存本地时间,也会高亮为差异,但实际是逻辑一致的
预览同步前,看清 INSERT/UPDATE/DELETE 具体影响哪些行
进入「数据同步」向导后,在「高级」页之前,先点「下一步」到预览页——这里显示的是 Navicat 根据比对结果算出的待执行动作:比如「将向 orders 表插入 3 行、更新 2 行、删除 1 行」。
点击任意表名,底部窗格立刻列出源 vs 目标的具体数据行,不同字段值会用黄色背景高亮。这个预览是只读的,但足够你快速判断:是不是真要删那条测试数据?更新的字段是不是恰好是 updated_at 这种自动维护字段?
- 如果某行只差一个
updated_at值,大概率是业务逻辑触发的自动更新,不用同步;可右键该行 → 「排除此项」 - 预览里显示「插入 0 行,更新 0 行,删除 N 行」,说明目标库有多余数据,得确认是否误操作残留
- 预览不显示 WHERE 条件细节,所以无法区分「因主键冲突跳过」和「因字段值相同忽略」——要看日志里的完整 SQL
同步日志里找被跳过的冲突行
即使开了「使用 INSERT IGNORE」,Navicat 也不会在预览页告诉你哪几行被跳了。真正记录跳过行为的地方是同步完成后的「信息日志」页,里面每条 INSERT IGNORE 执行都会附带警告:「Duplicate entry '105' for key 'PRIMARY'」。
这个警告不会中断同步,但容易被忽略——因为日志默认折叠,且警告级别是 yellow,不像错误(red)那么扎眼。
- 同步完务必点开「信息日志」→ 搜索
Duplicate entry,逐条确认这些 ID 在源库和目标库中是否真的该存在 - 如果目标库有
id = 105但字段值明显旧于源库,说明INSERT IGNORE让你丢了更新,此时该换REPLACE INTO或手动UPDATE - 日志里出现「1 warning」但没具体内容?点日志右上角「详细」按钮,展开才能看到原始报错
别信「自动匹配主键」,手动指定关联字段更可靠
Navicat 默认用表的主键或第一个唯一索引做行匹配。但如果源表和目标表主键名不同(比如 user_id vs id),或者其中一方没设主键,它会静默退化为全字段比对,导致性能暴跌且结果不可控。
正确做法是在「数据同步」向导第一步,点「选项」→ 「设置主键字段」,手动把两边逻辑上对应的字段拉到一起,例如把源库的 uid 和目标库的 user_id 配对。
- 配对后,预览页才真正按业务语义对齐行,而不是靠字段顺序或名字碰运气
- 如果表有复合主键(如
(order_id, sku)),必须全部字段一一配对,漏一个就失效 - 配对字段类型要兼容:不能把
VARCHAR(32)和CHAR(36)强行匹配,否则比对结果全是「不同」
实际用下来,最常被忽略的不是功能怎么点,而是「预览页不等于执行结果」——它只反映比对逻辑,不反映 SQL mode、触发器、外键约束带来的实际执行偏差。真正上线前,拿一条冲突数据在测试库手工跑一遍生成的 SQL,比什么都准。











