ITPub博客

首页 > 数据库 > 数据库开发技术 > MySQL 如何隐藏客户姓名、手机号或者身份证号中的部分信息

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

原创 数据库开发技术 作者:BUAA_dxy 时间:2022-01-24 21:45:12 0 删除 编辑

很多应用系统在前端显示个人信息时,为了保护信息安全需要将姓名、手机号、身份证号以及银行卡号等的部分信息进行隐藏,也就是显示为星号(*)。因此,本文给大家介绍一下如何在 MySQL 实现信息的隐藏。

如果觉得文章有用,欢迎关注❤️、点赞👍、推荐🎁

隐藏姓名中的姓氏或者名字

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

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

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

其中,char_length(emp_name) 用于获取姓名中的字符个数;如果姓名只有两个字,只需要将一个星号和第 2 个字连接起来,substr 用于返回子串;如果姓名包含三个或者更多字,倒数第 2 个字之前不动,倒数第 2 个字用星号替代,再加上最后一个字。

📝MySQL CASE 表达式也可以使用 IF 控制流函数替代。

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

SELECT emp_name "隐藏之前",
concat(substr(emp_name, 1, char_length(emp_name)-2), '*', substr(emp_name, -1, 1)) "隐藏之后"
FROM employee
ORDER BY emp_id
LIMIT 5;

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

另外,MySQL 还提供了一个 INSERT(str, pos, len, newstr) 函数,用于在字符串 str 的指定位置 pos 之后插入子串 newstr,替换随后的 len 个字符。使用该函数的实现更加简单,例如:

SELECT emp_name "隐藏之前",
insert(emp_name, char_length(emp_name)-1, 1,'*') "隐藏之后"
FROM employee
ORDER BY emp_id
LIMIT 5;

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

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

隐藏手机号中间的四位数

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

SELECT insert('13612345678', char_length('13612345678')-7, 4, '****') phone1,
insert('+861013612345678', char_length('+861013612345678')-7, 4, '****') phone2;

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

注意其中的字符位置的计算。

隐藏身份证号中间的四位数

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

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

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

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

SELECT concat(substr('320101200206014057', 1, 6), '********', substr('320101200206014057', -4, 4)) AS id;

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


原文作者:SQL编程思想;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
《SQL编程思想》作者,专注于数据库领域知识的分享。

注册时间:2021-08-26

  • 博文量
    443
  • 访问量
    546967