需手动启用Database Compare插件并重启;两次查询须同连接、同库、同字符集,且均带一致ORDER BY;浮点数用ROUND、时间转固定格式;差异结果无法直接导出CSV,需建临时表后SQL差集查询。

结果集右键菜单里没有“Compare with…”?先确认是否启用了 Compare 插件
DBeaver 默认不启用结果集对比功能,必须手动开启插件。很多人连菜单都找不到,不是操作错,是根本没装上。
打开 Help → Install New Software…,在 Work with 输入框粘贴:https://dbeaver.io/update/ce/latest/
勾选 Database Compare(注意不是 “Data Compare” 或 “Schema Compare”),重启 DBeaver。
重启后,执行两次查询,分别右键结果集 → 会看到多出 Compare with → Another Result Set… 选项。
两次查询必须用同一连接、同一数据库、同一字符集,否则对比会误报
对比逻辑是逐行逐列做字符串级比对,哪怕只是时区设置不同导致 NOW() 返回值格式微变,或 utf8mb4 和 utf8 对 emoji 的编码差异,都会被标为“不同”。
实操建议:
- 两次查询务必在同一个 SQL 编辑器标签页里执行,避免连接池复用不同 session
- 显式加
SET NAMES utf8mb4;开头,统一字符集 - 时间字段尽量转成固定格式,比如
DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s'),别直接比created_at - 浮点数字段用
ROUND(value, 6)统一精度,防止二进制表示差异
对比结果里显示“Row count differs”,但你知道数据量应该一样?检查是否漏了 ORDER BY
DBeaver 的结果集对比默认按“展示顺序”逐行比对,不是按主键或逻辑顺序。如果两次查询都没写 ORDER BY,MySQL 或 PostgreSQL 可能返回不同物理顺序,尤其涉及 JOIN、GROUP BY 或 LIMIT 时。
正确做法:
- 两次查询都加上完全一致的
ORDER BY id(或业务主键) - 避免只靠
LIMIT 100截断——截断位置不同会导致后续所有行错位 - 如果查的是聚合结果(如
COUNT(*)),就别用结果集对比,直接用数值差值更可靠
想导出差异结果到 CSV?得先保存为临时表再查
DBeaver 不支持直接导出“对比差异”这个视图,它只提供高亮和行标记(+ / - / !),没法一键导出。
绕过方法:
- 把第一次结果复制粘贴进新 SQL 编辑器,用
CREATE TEMPORARY TABLE tmp_a AS SELECT ...建临时表 - 同理建
tmp_b - 执行标准 SQL 差集查询,例如:
SELECT * FROM tmp_a WHERE id NOT IN (SELECT id FROM tmp_b); - 再对这个最终结果右键导出
真正容易被忽略的是:DBeaver 的对比功能本质是客户端内存比对,不走数据库计算。一旦结果集超过几万行,UI 会卡顿甚至崩溃——这种时候,宁可切回命令行或写个 Python 脚本做 hash 比对,也别硬扛。

















