MySQL 如何隱藏客戶姓名、手機號或者身份證號中的部分信息
作者: 不剪發(fā)的Tony老師
畢業(yè)于北京航空航天大學(xué),十多年數(shù)據(jù)庫管理與開發(fā)經(jīng)驗,目前在一家全球性的金融公司從事數(shù)據(jù)庫架構(gòu)設(shè)計。CSDN學(xué)院簽約講師以及GitChat專欄作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net
文章目錄
隱藏姓名中的姓氏或者名字
隱藏手機號中間的四位數(shù)
隱藏身份證號中間的四位數(shù)
大家好,我是只談技術(shù)不剪發(fā)的 Tony 老師。很多應(yīng)用系統(tǒng)在前端顯示個人信息時,為了保護信息安全需要將姓名、手機號、身份證號以及銀行卡號等的部分信息進行隱藏,也就是顯示為星號(*)。因此,本文給大家介紹一下如何在 MySQL 實現(xiàn)信息的隱藏。
如果覺得文章有用,歡迎評論??、點贊??、推薦??
隱藏姓名中的姓氏或者名字
以醫(yī)院排隊叫號系統(tǒng)為例,通常會隱藏患者的姓氏(兩個字的姓名)或者名字中的倒數(shù)第二個字(三個字或更多字的姓名),例如“*三”或者“李*亮”。對于 MySQL 而言,實現(xiàn)這一功能比較簡單,可以結(jié)合使用 CASE 表達式和字符串函數(shù)。例如(示例表):
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;
隱藏之前|隱藏之后|
-------|------|
劉備 |*備 |
關(guān)羽 |*羽 |
張飛 |*飛 |
諸葛亮 |諸*亮 |
黃忠 |*忠 |
其中,char_length(emp_name) 用于獲取姓名中的字符個數(shù);如果姓名只有兩個字,只需要將一個星號和第 2 個字連接起來,substr 用于返回子串;如果姓名包含三個或者更多字,倒數(shù)第 2 個字之前不動,倒數(shù)第 2 個字用星號替代,再加上最后一個字。
??MySQL CASE 表達式也可以使用 IF 控制流函數(shù)替代,詳細(xì)的介紹可以參考這篇文章。
實際上我們還可以進一步簡化,直接使用上面的 ELSE 分支實現(xiàn)所有功能:
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 函數(shù)中的第一個參數(shù)實際上是空字符串。
另外,MySQL 還提供了一個 INSERT(str, pos, len, newstr) 函數(shù),用于在字符串 str 的指定位置 pos 之后插入子串 newstr,替換隨后的 len 個字符。使用該函數(shù)的實現(xiàn)更加簡單,例如:
SELECT emp_name "隱藏之前",
insert(emp_name, char_length(emp_name)-1, 1,'*') "隱藏之后"
FROM employee
ORDER BY emp_id
LIMIT 5;
隱藏之前|隱藏之后|
-------|------|
劉備 |*備 |
關(guān)羽 |*羽 |
張飛 |*飛 |
諸葛亮 |諸*亮 |
黃忠 |*忠 |
INSERT 函數(shù)執(zhí)行的操作和前面的示例本質(zhì)上一樣。
??MySQL 還提供了大量處理和分析字符數(shù)據(jù)的函數(shù)和運算符,詳細(xì)內(nèi)容可以參考這篇文章。
隱藏手機號中間的四位數(shù)
對于手機號的顯示,通常是隱藏第 4 位到第 7 位數(shù)字;不過需要注意,某些號碼之前可能還有國際區(qū)號或地區(qū)號等,例如中國國際區(qū)號 86、北京區(qū)號10。因此,我們可以影藏手機號中的倒數(shù)第 8 位開始的 4 位數(shù)字。同樣,我們可以使用 MySQL 中的 INSERT 函數(shù)實現(xiàn):
SELECT insert('13612345678', char_length('13612345678')-7, 4, '****') phone1,
insert('+861013612345678', char_length('+861013612345678')-7, 4, '****') phone2;
phone1 |phone2 |
-----------|----------------|
136****5678|+8610136****5678|
注意其中的字符位置的計算。
隱藏身份證號中間的四位數(shù)
第二代居民身份證號總共有 18 位,最后一位可能是 0-9 或者 X??梢赃x擇隱藏第 7 位開始的 8 位數(shù)字,也就是出生日期。使用 INSERT 函數(shù)實現(xiàn)如下:
SELECT insert('320101200206014057', 7, 8, '*******') AS id;
id |
-----------------|
320101*******4057|
當(dāng)然,也可以使用字符串拼接的方式實現(xiàn):
SELECT concat(substr('320101200206014057', 1, 6), '********', substr('320101200206014057', -4, 4)) AS id;
id |
-----------------|
320101*******4057|