navicat数据对比默认展示所有行,需通过status列手动过滤modified/inserted/deleted项来定位不匹配行;关键前提是主键或比较键必须正确对齐,否则结果不可信。

Navicat 数据对比结果默认包含匹配与不匹配行
Navicat 的「数据同步」或「结构/数据对比」功能默认会展示所有行:完全匹配的、源库有目标库没有的、目标库有源库没有的、以及内容不一致的。你想要的“仅筛选出不匹配的行”,其实不是靠预设选项一键开启,而是依赖结果界面的手动过滤和状态列识别——因为 Navicat 本身不提供「对比时跳过匹配行」的执行级开关。
关键操作:用 Status 列 + 右键过滤快速定位不匹配行
对比执行完成后,在结果表格中找到名为 Status 的列(通常在最左侧或靠右位置),该列明确标注每行的比对状态。你需要关注以下三类值:
-
Modified:同一主键/唯一键下,字段值存在差异(即“内容不匹配”) -
Inserted:源库有、目标库无(属于“缺失”,也算不匹配场景) -
Deleted:源库无、目标库有(同上,逻辑上不一致)
右键点击 Status 列任意单元格 → 选择「Filter by Selection」→ 勾选上述三项(取消勾选 Identical 和 Skipped)。此时表格立即只显示不匹配的行。注意:Modified 行还会高亮标出具体哪些字段不同(黄色背景),可直接查看差异细节。
容易忽略的坑:主键/唯一键没对齐会导致误判为“不匹配”
Navicat 是按主键或你指定的「比较键」来逐行对齐比对的。如果两张表的主键定义不一致(比如 A 表用 id,B 表用 uid 且未在对比设置中正确映射),或者某张表根本没设主键/唯一索引,Navicat 会退化为全表笛卡尔比对,结果中大量 Inserted/Deleted 实际是“对不上号”,而非真实数据差异。
- 对比前务必确认两张表都已正确定义主键,或在对比向导的「Key Columns」步骤中手动指定等价字段对(如
id↔user_id) - 若表无主键,强烈建议先加临时唯一索引,否则
Status列不可信 - 字符集或排序规则差异(如
utf8mb4_0900_as_csvsutf8mb4_general_ci)可能导致Modified误报,需检查连接参数中的collation是否一致
导出不匹配行:别用“导出全部”,要先过滤再导出
很多人导出后发现文件里全是匹配行,就是因为忘了先过滤。正确流程是:
- 完成对比 → 右键
Status列过滤出Modified/Inserted/Deleted - 点击工具栏「Export」按钮(不是右键菜单里的「Export Selected」)→ 此时 Navicat 默认只导出当前可见行(即已过滤后的不匹配行)
- 格式选
CSV或Excel即可;如需 SQL 语句,选「Synchronize」后生成的脚本才含UPDATE/INSERT/DELETE,但那是用于修复,不是原始数据快照
真正难的不是点几下,而是确保两表的键对齐方式、空值处理逻辑、时间精度(DATETIME(3) vs DATETIME(6))这些底层细节一致——否则你筛出来的“不匹配”,可能只是 Navicat 自己比错了。











