DBeaver数据脱敏仅在“数据库→数据库”导出时自动生效,CSV等文件导出绕过脱敏;需在连接级配置maskColumns规则并重启连接,且导出目标必须选“数据库”、操作选“已存在”,否则导出明文。

脱敏规则必须在数据源连接级配置,不是表或查询级
DBeaver 的数据脱敏(如身份证、手机号掩码)是绑定在 数据源连接 上的列级策略,不是针对某张表临时生效,也不是在导出时动态加规则。这意味着:你右键某张表点“导出数据”时,如果该连接没配脱敏规则,导出结果就是明文;哪怕你在 SQL 编辑器里写了 SELECT CONCAT('***', SUBSTR(id_card, -4)),那也属于手动脱敏,和 DBeaver 内置脱敏机制无关。
常见错误现象:导出的 CSV 里身份证还是完整18位,但你在结果集面板里看到的已经是 ************1234 —— 这说明脱敏只作用于 UI 展示,没生效到导出流程。
- 必须打开「编辑连接」→「驱动属性」标签页,找到类似
maskColumns或厂商特定项(如db2.mask.columns) - 值格式为
schema.table.column:rule,例如public.users.id_card:mask(0,12) - 规则语法依赖数据库类型:PostgreSQL 用
mask(),MySQL 需配合自定义函数,DB2 用DB2ColumnMask类规则文本 - 修改后要重启连接(断开再重连),否则导出仍走旧配置
导出时必须选“数据库”目标类型,才能触发脱敏逻辑
很多人卡在“明明配了脱敏,导出文件却是明文”,根本原因是误用了导出路径:选“文件”(CSV/SQL/JSON)时,DBeaver 绕过所有列掩码逻辑,直接读原始字段值写入;只有选“数据库”作为目标,才会走完整的 IDataTransferConsumer 流程,其中包含脱敏处理器。
使用场景:你想把脱敏后的 users 表数据导出到测试库的 users_anonymized 表,而不是生成 CSV 文件。
- 右键源表 →「导出数据」→ 第一步选择「数据库」而非「文件」
- 目标容器选中测试库中的空表(结构需完全一致)
- 映射页的「操作」必须选
已存在,否则会建新表且不应用脱敏 - 该方式导出的数据,在目标表里也是脱敏态(如查出来就是
***1234),因为写入的是脱敏后值
想导出脱敏后的 CSV?只能靠 SQL 查询 + 手动规则
目前 DBeaver 没有“导出脱敏 CSV”的开关。官方导出向导对文件类目标(CSV/JSON/Excel)一律跳过脱敏层,这是设计限制,不是 bug。
可行替代方案是用 SQL 查询模拟脱敏逻辑,再导出结果集:
- 新建 SQL 编辑器,写带脱敏函数的查询,例如:
SELECT id, CONCAT('***', RIGHT(phone, 4)) AS phone, ... FROM users - 执行后,在结果集底部点「导出数据」按钮(不是右键表)
- 此时导出的是查询结果,即已脱敏数据,可安全选 CSV/Excel
- 注意:不同数据库函数名不同,MySQL 用
RIGHT(),PostgreSQL 用RIGHT()或SUBSTRING(),Oracle 用SUBSTR() - 若字段多、规则复杂,建议把脱敏逻辑封装成视图,然后查视图导出
导出前务必确认字符编码和分隔符,否则脱敏字段乱码或错列
脱敏后字段常含特殊符号(*、#、中文括号等),若导出 CSV 时编码设成 GBK 或未启用文本限定符,Excel 打开会乱码或把 ***1234 当数字科学计数法处理。
- 导出向导中「输出设置」页,编码强制选
UTF-8 - CSV 分隔符优先用
\t(制表符),比逗号更少冲突 - 勾选「文本限定符」,值设为
",确保含 * 的字段被包裹 - 避免用 Excel 直接双击打开 CSV,应从 Excel 菜单「数据 → 从文本/CSV」导入,并指定 UTF-8 和分隔符
脱敏导出最易忽略的点:脱敏规则只在「数据库→数据库」导出路径中自动生效,其他所有导出方式(CSV/SQL/JSON/Excel)都默认绕过——这不是遗漏配置,而是当前版本的明确行为边界。


















