在业务系统运行过程中,数据库中存储的用户手机号、身份证号、银行卡号等敏感信息,需要按照数据安全规范进行脱敏处理,避免敏感数据在查询、传输过程中泄露。通过SQL语句批量更新敏感数据为脱敏状态,是高效完成脱敏任务的常用方式,既可以借助数据库内置的MASK函数实现,也可以通过字符串截断拼接的方式完成,适配不同的数据库环境和脱敏需求。

一、使用MASK函数实现批量脱敏更新
部分数据库(如MySQL 8.0+、SQL Server 2016+)内置了数据脱敏相关的MASK函数,可以直接调用函数完成敏感字段的脱敏处理,操作逻辑更简洁。
1. MySQL中的MASK函数应用
MySQL的MASK函数可以对指定字段按照规则进行脱敏,常见的用法是保留字段前后指定位数的字符,中间部分用星号替换。
以下示例是对用户表的手机号字段进行脱敏,保留前3位和后4位,中间4位替换为星号:
-- 批量更新用户表手机号字段为脱敏状态 UPDATE user_info SET phone = MASK(phone, 3, 4, '*') WHERE phone IS NOT NULL;
上述语句中,MASK函数的第一个参数是需要脱敏的字段,第二个参数是保留的前缀长度,第三个参数是保留的后缀长度,第四个参数是替换中间部分的字符。
2. SQL Server中的动态数据掩码应用
SQL Server通过动态数据掩码功能实现脱敏,需要先为字段添加掩码规则,再执行更新操作。
以下示例是为用户表的身份证号字段添加掩码规则,保留前1位和后2位,中间部分替换为星号:
-- 为身份证号字段添加动态掩码 ALTER TABLE user_info ALTER COLUMN id_card ADD MASKED WITH (FUNCTION = 'partial(1, "********", 2)'); -- 批量更新身份证号字段为脱敏状态 UPDATE user_info SET id_card = id_card WHERE id_card IS NOT NULL;
二、使用字符串截断实现批量脱敏更新
如果数据库没有内置的MASK函数,可以通过字符串截取函数拼接的方式实现脱敏,适配所有支持基础字符串函数的SQL环境。
1. 手机号脱敏示例
手机号长度为11位,通常保留前3位和后4位,中间4位替换为星号,实现逻辑是先截取前3位,再拼接4个星号,最后拼接后4位。
-- 批量更新手机号字段为脱敏状态
UPDATE user_info
SET phone = CONCAT(
SUBSTRING(phone, 1, 3),
'****',
SUBSTRING(phone, 8, 4)
)
WHERE phone IS NOT NULL AND LENGTH(phone) = 11;
2. 邮箱脱敏示例
邮箱脱敏通常保留@符号前的第一个字符和@符号及后面的域名部分,中间部分替换为星号。
-- 批量更新邮箱字段为脱敏状态
UPDATE user_info
SET email = CONCAT(
SUBSTRING(email, 1, 1),
'****',
SUBSTRING(email, INSTR(email, '@'), LENGTH(email) - INSTR(email, '@') + 1)
)
WHERE email IS NOT NULL AND email LIKE '%@%';
三、批量更新脱敏的注意事项
- 更新前先备份数据,避免脱敏规则错误导致数据无法恢复。
- 先通过SELECT语句验证脱敏逻辑的正确性,再执行UPDATE操作。
- 对于大表批量更新,建议分批次执行,避免锁表时间过长影响业务运行。
- 脱敏后的数据需要符合业务查询需求,比如部分业务需要保留后4位用于用户身份核验,需要调整保留位数。
通过以上两种方式,都可以高效完成SQL批量更新敏感数据为脱敏状态的操作,开发者可以根据自身使用的数据库类型和脱敏需求选择合适的方法。