Oracle漢字使用者名稱資料脫敏長度不變,rpad函數使用

來源:互聯網
上載者:User

標籤: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函數使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.