导读:本期聚焦于小伙伴创作的《如何编写高效的敏感数据脱敏存储过程?利用REPLACE与SUBSTRING实现脱敏的方法是什么》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何编写高效的敏感数据脱敏存储过程?利用REPLACE与SUBSTRING实现脱敏的方法是什么》有用,将其分享出去将是对创作者最好的鼓励。

在数据库日常运维和开发中,用户手机号、身份证号、银行卡号等敏感数据需要按照合规要求做脱敏处理,避免明文存储带来的数据泄露风险。通过存储过程封装脱敏逻辑,可以统一处理规则,提升批量操作的效率。

如何编写高效的敏感数据脱敏存储过程?利用REPLACE与SUBSTRING实现脱敏的方法是什么

核心函数说明

要实现脱敏功能,首先需要了解REPLACESUBSTRING两个函数的基础用法,不同数据库的函数语法略有差异,以下以MySQL为例说明。

SUBSTRING函数

该函数用于截取字符串的指定部分,基础语法为SUBSTRING(str, start_pos, length),其中str是待处理的字符串,start_pos是起始截取位置,length是截取长度,如果省略length则截取到字符串末尾。

REPLACE函数

该函数用于将字符串中的指定子串替换为新内容,基础语法为REPLACE(str, old_str, new_str),会将str中所有出现的old_str都替换为new_str。

常见敏感数据脱敏逻辑

大部分敏感数据的脱敏规则都是保留前几位和后几位,中间用星号替换,我们可以结合两个函数实现这个逻辑:先通过SUBSTRING取出需要保留的前缀和后缀,再用REPLACE或者直接拼接的方式组合成脱敏后的字符串。

手机号脱敏示例

手机号通常保留前3位和后4位,中间4位替换为星号,实现代码如下:

-- 手机号脱敏:保留前3后4,中间替换为****
SELECT 
    phone_number,
    CONCAT(
        SUBSTRING(phone_number, 1, 3),
        '****',
        SUBSTRING(phone_number, 8, 4)
    ) AS masked_phone
FROM user_info;

身份证号脱敏示例

身份证号保留前6位和后4位,中间替换为8个星号,实现代码如下:

-- 身份证号脱敏:保留前6后4,中间替换为********
SELECT 
    id_card,
    CONCAT(
        SUBSTRING(id_card, 1, 6),
        '********',
        SUBSTRING(id_card, 15, 4)
    ) AS masked_id_card
FROM user_info;

封装为通用脱敏存储过程

为了复用脱敏逻辑,我们可以编写存储过程,支持传入表名、字段名和脱敏类型,自动完成对应字段的脱敏更新操作。

-- 创建脱敏存储过程
DELIMITER //
CREATE PROCEDURE sp_mask_sensitive_data(
    IN p_table_name VARCHAR(100),  -- 目标表名
    IN p_column_name VARCHAR(100), -- 待脱敏字段名
    IN p_mask_type VARCHAR(20)     -- 脱敏类型:phone/id_card/email
)
BEGIN
    DECLARE v_sql VARCHAR(1000);
    -- 根据脱敏类型生成不同的更新SQL
    IF p_mask_type = 'phone' THEN
        -- 手机号脱敏逻辑
        SET v_sql = CONCAT(
            'UPDATE ', p_table_name, 
            ' SET ', p_column_name, ' = CONCAT(
                SUBSTRING(', p_column_name, ', 1, 3),
                ''****'',
                SUBSTRING(', p_column_name, ', 8, 4)
            ) WHERE ', p_column_name, ' IS NOT NULL'
        );
    ELSEIF p_mask_type = 'id_card' THEN
        -- 身份证号脱敏逻辑
        SET v_sql = CONCAT(
            'UPDATE ', p_table_name, 
            ' SET ', p_column_name, ' = CONCAT(
                SUBSTRING(', p_column_name, ', 1, 6),
                ''********'',
                SUBSTRING(', p_column_name, ', 15, 4)
            ) WHERE ', p_column_name, ' IS NOT NULL'
        );
    ELSEIF p_mask_type = 'email' THEN
        -- 邮箱脱敏逻辑:保留@前第一位和@后域名,中间替换为***
        SET v_sql = CONCAT(
            'UPDATE ', p_table_name, 
            ' SET ', p_column_name, ' = CONCAT(
                SUBSTRING(', p_column_name, ', 1, 1),
                ''***'',
                SUBSTRING(', p_column_name, ', INSTR(', p_column_name, ', ''@''), LENGTH(', p_column_name, '))
            ) WHERE ', p_column_name, ' IS NOT NULL'
        );
    END IF;
    -- 执行动态SQL
    SET @update_sql = v_sql;
    PREPARE stmt FROM @update_sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

存储过程优化建议

  • 执行脱敏前先对目标字段加索引,提升SUBSTRING函数的处理效率,避免全表扫描。
  • 如果数据量较大,建议分批次执行更新操作,每次处理1000-5000条数据,避免长事务锁表。
  • 可以在存储过程中增加日志表记录,每次脱敏操作完成后记录处理的表名、字段名、处理行数和时间,方便后续审计。
  • 对于固定格式的敏感数据,可以提前校验字段长度,避免截取位置超出字符串范围导致报错。

存储过程调用示例

调用上述存储过程对user_info表的phone字段做手机号脱敏,代码如下:

-- 调用存储过程脱敏手机号
CALL sp_mask_sensitive_data('user_info', 'phone', 'phone');

-- 调用存储过程脱敏身份证号
CALL sp_mask_sensitive_data('user_info', 'id_card', 'id_card');

存储过程REPLACESUBSTRING敏感数据脱敏修改时间:2026-07-06 14:42:25

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。