Microsoft SQL Server 如何隱藏客戶(hù)姓名、手機(jī)號(hào)或者身份證號(hào)中的部分信息

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

文章目錄

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

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

如果覺(jué)得文章有用,歡迎評(píng)論??、點(diǎn)贊??、推薦??
隱藏姓名中的姓氏或者名字

以醫(yī)院排隊(duì)叫號(hào)系統(tǒng)為例,通常會(huì)隱藏患者的姓氏(兩個(gè)字的姓名)或者名字中的倒數(shù)第二個(gè)字(三個(gè)字或更多字的姓名),例如“*備”或者“諸*亮”。對(duì)于 Microsoft SQL Server 而言,可以結(jié)合使用 CASE 表達(dá)式和字符串函數(shù)實(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) 用于獲取姓名中的字符個(gè)數(shù);如果姓名只有兩個(gè)字,只需要將一個(gè)星號(hào)和第 2 個(gè)字連接起來(lái),right 函數(shù)用于返回第 2 個(gè)字;如果姓名包含三個(gè)或者更多字,將倒數(shù)第 2 個(gè)字用星號(hào)替代,left 函數(shù)用于返回字符串左側(cè)的字符。

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

實(shí)際上我們還可以進(jìn)一步簡(jiǎn)化,直接使用上面的 ELSE 分支實(shí)現(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;

 

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

另外,Microsoft SQL Server 還提供了一個(gè) stuff( character_expression , start , length , replaceWith_expression ) 函數(shù),用于在字符串 character_expression 的指定位置 start 之后使用子串 replaceWith_expression 替換隨后的 length 個(gè)字符。使用該函數(shù)實(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ù),詳細(xì)內(nèi)容可以參考官方文檔。

隱藏手機(jī)號(hào)中間的四位數(shù)

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

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

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

 

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

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

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

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

 

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

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

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

 

總結(jié)

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

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