標籤:sql rac .com 字元 -- 使用者 計算 string 部分
資訊安全考慮,有時需要對使用者名稱稱進行資料脫敏。
針對Oracle資料庫,進行取數資料脫敏處理
脫敏規則:
長度小於9個字元,只保留前3個漢字與後3個漢字,中間全部由*填充。
長度9個字及以上及奇數,隱去中間3個字;長度10個字及以上及奇數,隱去中間4個字。
例如:
公司名稱:宇宙無敵厲害的超級大公司的杭州分公司
欄位長度:18
脫敏後:宇宙無敵厲害的****司的杭州分公司
可實現的正確答案:
selectt.no, ---公司編號case when length(t.name)<=8 then substr(t.name,1,3)||substr(‘**‘,1,length(t.name)-6)|| substr(t.name,-3,3) -------公司名稱長度絕對大於6,一般都在6以上else substr(t.name,1,round(length(t.name)/2,0)-2)||substr(‘****‘,1,4-mod(length(t.name),2))||substr(t.name,-(round(length(t.name)/2,0)-2),round(length(t.name)/2,0)-2) end ) -----脫敏後公司名from aaa t;
說明:
substr(t.name,1,3) 公司名稱前三個字
substr(t.name,-3,3) 公司名稱後三個字
round(length(t.name)/2,0)-2 計算公司名稱 * 前一部分的長度
substr(‘****‘,1,4-mod(length(t.name),2)) 單數3個* 雙數4個*
oracle 中使用substr函數對中文進行識別,可以一個漢字一個漢字的識別。
輸入:
substr(‘宇宙無敵厲害的超級大公司的杭州分公司‘,1,3)
輸出:
宇宙無
彎路:
中間嘗試使用rpad(或者lpad)函數。
發現該函數對中文欄位長度識別有很大的問題。
rpad(‘宇宙無敵‘,10,‘*‘)
理論上,字串長度為10,“宇宙無敵”長度為4,輸出結果應該為:宇宙無敵******
實際上,Oracle讀取“宇宙無敵”長度為8,輸出結果為:宇宙無敵**
具體情況參考:https://www.cnblogs.com/objectorl/p/rpad-length-issue-in-multibyte-encoding.html
Lpad Function:在PL/SQL中用於往源字串的左側填充一些字元。
函數參數:lpad( string1, padded_length, [ pad_string ] )
其中
string1:源字串
padded_length:最終返回的字串的長度,如果最終返回的字串的長度比源字串的小,那麼此函數實際上對源串進行截斷處理
pad_string:用於填充的字元,可以不填,預設為空白字元
Oracle漢字使用者名稱資料脫敏長度不變,rpad函數使用