在业务系统中,用户手机号、身份证号、银行卡号等敏感信息如果直接明文展示,会带来极大的隐私泄露风险,因此需要在查询展示时对这类数据进行脱敏处理。MySQL的SUBSTR函数可以截取字符串的指定部分,REPLACE函数可以替换字符串中的指定内容,两者结合就能实现灵活的数据脱敏效果。

相关函数基础用法
SUBSTR函数
SUBSTR函数用于截取字符串的指定部分,语法格式如下:
-- 语法:SUBSTR(str, pos, len)
-- str:要截取的原始字符串
-- pos:起始位置,1表示字符串第一个字符
-- len:要截取的长度,可选,不填则截取到字符串末尾
SELECT SUBSTR('13812345678', 1, 3); -- 结果为138
SELECT SUBSTR('13812345678', 8); -- 结果为5678
REPLACE函数
REPLACE函数用于替换字符串中的指定子串,语法格式如下:
-- 语法:REPLACE(str, from_str, to_str)
-- str:原始字符串
-- from_str:要被替换的子串
-- to_str:替换后的新子串
SELECT REPLACE('13812345678', '1234', '****'); -- 结果为138****5678
常见脱敏场景实现
手机号脱敏
手机号通常保留前3位和后4位,中间4位替换为星号,实现代码如下:
-- 假设user表有phone字段存储手机号
SELECT
phone AS 原始手机号,
CONCAT(
SUBSTR(phone, 1, 3),
'****',
SUBSTR(phone, 8)
) AS 脱敏手机号
FROM user;
执行后结果如下:
| 原始手机号 | 脱敏手机号 |
|---|---|
| 13812345678 | 138****5678 |
| 15987654321 | 159****4321 |
身份证号脱敏
身份证号保留前6位和后4位,中间部分替换为星号,实现代码如下:
-- 假设user表有id_card字段存储身份证号
SELECT
id_card AS 原始身份证号,
CONCAT(
SUBSTR(id_card, 1, 6),
'********',
SUBSTR(id_card, 15)
) AS 脱敏身份证号
FROM user;
邮箱脱敏
邮箱保留前缀前2位和后缀域名,中间部分替换为星号,实现代码如下:
-- 假设user表有email字段存储邮箱
SELECT
email AS 原始邮箱,
CONCAT(
SUBSTR(SUBSTR(email, 1, INSTR(email, '@') - 1), 1, 2),
'****',
SUBSTR(email, INSTR(email, '@'))
) AS 脱敏邮箱
FROM user;
注意事项
- 脱敏操作仅建议在查询展示时使用,不要直接更新原表数据,避免原始数据丢失。
- 如果字段值长度不固定,需要先判断长度再处理,避免截取超出范围导致结果异常。
- 对于特殊格式的敏感数据,可以先拆分再组合,灵活调整脱敏规则。