Microsoft SQL Server 如何隱藏客戶姓名、手機號或者身份證號中的部分信息

作者: 不剪發(fā)的Tony老師
畢業(yè)于北京航空航天大學,十多年數(shù)據(jù)庫管理與開發(fā)經(jīng)驗,目前在一家全球性的金融公司從事數(shù)據(jù)庫架構(gòu)設(shè)計。CSDN學院簽約講師以及GitChat專欄作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net

文章目錄

        隱藏姓名中的姓氏或者名字
        隱藏手機號中間的四位數(shù)
        隱藏身份證號中間的四位數(shù)
        總結(jié)

大家好,我是只談技術(shù)不剪發(fā)的 Tony 老師。姓名、手機號、身份證號以及銀行卡號等屬于個人敏感信息。為了保護信息安全,在前端界面顯示時可能需要將這些信息中的部分內(nèi)容進行隱藏,也就是顯示為星號(*)。因此,本文給大家介紹一下如何在 Microsoft SQL Server 實現(xiàn)信息的隱藏。

如果覺得文章有用,歡迎評論??、點贊??、推薦??
隱藏姓名中的姓氏或者名字

以醫(yī)院排隊叫號系統(tǒng)為例,通常會隱藏患者的姓氏(兩個字的姓名)或者名字中的倒數(shù)第二個字(三個字或更多字的姓名),例如“*備”或者“諸*亮”。對于 Microsoft SQL Server 而言,可以結(jié)合使用 CASE 表達式和字符串函數(shù)實現(xiàn)這一功能。例如(示例表):

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;

隱藏之前|隱藏之后|
-------|------|
劉備   |*備    |
關(guān)羽   |*羽    |
張飛   |*飛    |
諸葛亮 |諸*亮   |
黃忠   |*忠    |

 

其中,len(emp_name) 用于獲取姓名中的字符個數(shù);如果姓名只有兩個字,只需要將一個星號和第 2 個字連接起來,right 函數(shù)用于返回第 2 個字;如果姓名包含三個或者更多字,將倒數(shù)第 2 個字用星號替代,left 函數(shù)用于返回字符串左側(cè)的字符。

    ??除了使用 left 和 right 函數(shù)返回子串之外,也可以使用 substring 函數(shù)實現(xiàn)相同的功能。

實際上我們還可以進一步簡化,直接使用上面的 ELSE 分支實現(xiàn)所有功能:

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

 

如果姓名只有兩個字的話,concat 函數(shù)中的第一個參數(shù)實際上是空字符串。

另外,Microsoft SQL Server 還提供了一個 stuff( character_expression , start , length , replaceWith_expression ) 函數(shù),用于在字符串 character_expression 的指定位置 start 之后使用子串 replaceWith_expression 替換隨后的 length 個字符。使用該函數(shù)實現(xiàn)相同的功能如下:

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

隱藏之前|隱藏之后|
-------|------|
劉備   |*備    |
關(guān)羽   |*羽    |
張飛   |*飛    |
諸葛亮 |諸*亮   |
黃忠   |*忠    |

 

stuff 函數(shù)執(zhí)行的操作和前面的示例本質(zhì)上一樣。

    ??Microsoft SQL Server 還提供了大量處理和分析字符數(shù)據(jù)的函數(shù),詳細內(nèi)容可以參考官方文檔。

隱藏手機號中間的四位數(shù)

對于手機號的顯示,通常是隱藏第 4 位到第 7 位數(shù)字;不過需要注意,某些號碼之前可能還有國際區(qū)號或地區(qū)號等,例如中國國際區(qū)號 86、北京區(qū)號10。因此,我們可以隱藏手機號中的倒數(shù)第 8 位開始的 4 位數(shù)字。同樣,我們可以使用 stuff 函數(shù)實現(xiàn):

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

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

 

注意其中的字符位置的計算。
隱藏身份證號中間的四位數(shù)

第二代居民身份證號總共有 18 位,最后一位可能是 0-9 或者 X??梢赃x擇隱藏第 7 位開始的 8 位數(shù)字,也就是出生日期。使用 stuff 函數(shù)實現(xiàn)如下:

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

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

 

當然,也可以使用字符串拼接的方式實現(xiàn):

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

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

 

總結(jié)

本文介紹了如何利用 Microsoft SQL Server 中的 CASE 表達、len、left、right、stuff、concat 等字符串函數(shù)實現(xiàn)信息的隱藏,包括姓名、手機號以及身份證號等個人敏感信息的保護。

如果你還有其他的案例或者實現(xiàn)方法,歡迎留言討論!