Microsoft SQL Server 如何隐藏客户姓名、手机号或者身份证号中的部分信息

作者: 不剪发的Tony老师
毕业于北京航空航天大学,十多年数据库管理与开发经验,目前在一家全球性的金融公司从事数据库架构设计。CSDN学院签约讲师以及GitChat专栏作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net

文章目录

        隐藏姓名中的姓氏或者名字
        隐藏手机号中间的四位数
        隐藏身份证号中间的四位数
        总结

大家好,我是只谈技术不剪发的 Tony 老师。姓名、手机号、身份证号以及银行卡号等属于个人敏感信息。为了保护信息安全,在前端界面显示时可能需要将这些信息中的部分内容进行隐藏,也就是显示为星号(*)。因此,本文给大家介绍一下如何在 Microsoft SQL Server 实现信息的隐藏。

如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁
隐藏姓名中的姓氏或者名字

以医院排队叫号系统为例,通常会隐藏患者的姓氏(两个字的姓名)或者名字中的倒数第二个字(三个字或更多字的姓名),例如“*备”或者“诸*亮”。对于 Microsoft SQL Server 而言,可以结合使用 CASE 表达式和字符串函数实现这一功能。例如(示例表):

SELECT TOP 5
       emp_name "隐藏之前",
       CASE len(emp_name)
         WHEN 2 THEN concat('*', right(emp_name, 1))
         ELSE concat(left(emp_name, len(emp_name)-2), '*', right(emp_name, 1))
       END "隐藏之后"
FROM employee
ORDER BY emp_id;

隐藏之前|隐藏之后|
-------|------|
刘备   |*备    |
关羽   |*羽    |
张飞   |*飞    |
诸葛亮 |诸*亮   |
黄忠   |*忠    |

 

其中,len(emp_name) 用于获取姓名中的字符个数;如果姓名只有两个字,只需要将一个星号和第 2 个字连接起来,right 函数用于返回第 2 个字;如果姓名包含三个或者更多字,将倒数第 2 个字用星号替代,left 函数用于返回字符串左侧的字符。

    📝除了使用 left 和 right 函数返回子串之外,也可以使用 substring 函数实现相同的功能。

实际上我们还可以进一步简化,直接使用上面的 ELSE 分支实现所有功能:

SELECT TOP 5
       emp_name "隐藏之前",
       concat(left(emp_name, len(emp_name)-2), '*', right(emp_name, 1)) "隐藏之后"
FROM employee
ORDER BY emp_id;

 

如果姓名只有两个字的话,concat 函数中的第一个参数实际上是空字符串。

另外,Microsoft SQL Server 还提供了一个 stuff( character_expression , start , length , replaceWith_expression ) 函数,用于在字符串 character_expression 的指定位置 start 之后使用子串 replaceWith_expression 替换随后的 length 个字符。使用该函数实现相同的功能如下:

SELECT TOP 5
       emp_name "隐藏之前",
       stuff(emp_name, len(emp_name)-1, 1,'*') "隐藏之后"
FROM employee
ORDER BY emp_id;

隐藏之前|隐藏之后|
-------|------|
刘备   |*备    |
关羽   |*羽    |
张飞   |*飞    |
诸葛亮 |诸*亮   |
黄忠   |*忠    |

 

stuff 函数执行的操作和前面的示例本质上一样。

    📝Microsoft SQL Server 还提供了大量处理和分析字符数据的函数,详细内容可以参考官方文档。

隐藏手机号中间的四位数

对于手机号的显示,通常是隐藏第 4 位到第 7 位数字;不过需要注意,某些号码之前可能还有国际区号或地区号等,例如中国国际区号 86、北京区号10。因此,我们可以隐藏手机号中的倒数第 8 位开始的 4 位数字。同样,我们可以使用 stuff 函数实现:

SELECT stuff('13612345678', len('13612345678')-7, 4, '****') phone1,
       stuff('+861013612345678', len('+861013612345678')-7, 4, '****') phone2;

phone1     |phone2          |
-----------|----------------|
136****5678|+8610136****5678|

 

注意其中的字符位置的计算。
隐藏身份证号中间的四位数

第二代居民身份证号总共有 18 位,最后一位可能是 0-9 或者 X。可以选择隐藏第 7 位开始的 8 位数字,也就是出生日期。使用 stuff 函数实现如下:

SELECT stuff('320101200206014057', 7, 8, '*******') AS id;

id               |
-----------------|
320101*******4057|

 

当然,也可以使用字符串拼接的方式实现:

SELECT concat(substring('320101200206014057', 1, 6), '********', substring('320101200206014057', 15, 4)) AS id;

id               |
-----------------|
320101*******4057|

 

总结

本文介绍了如何利用 Microsoft SQL Server 中的 CASE 表达、len、left、right、stuff、concat 等字符串函数实现信息的隐藏,包括姓名、手机号以及身份证号等个人敏感信息的保护。

如果你还有其他的案例或者实现方法,欢迎留言讨论!