Oracle汉字用户名数据脱敏长度不变,rpad函数使用
信息安全考虑,有时需要对用户名称进行数据脱敏。 针对Oracle数据库,进行取数数据脱敏处理 脱敏规则: 长度小于9个字符,只保留前3个汉字与后3个汉字,中间全部由*填充。 长度9个字及以上及奇数,隐去中间3个字;长度10个字及以上及奇数,隐去中间4个字。 例如: 公司名称:宇宙无敌厉害的超级大公司的杭州分公司 ? 字段长度:18 脱敏后:宇宙无敌厉害的****司的杭州分公司 ? 可实现的正确答案: select t.no,---公司编号 case when length(t.name)<=8 then substr(t.name,1,3)||substr(‘**‘,length(t.name)-6)|| substr(t.name,-3,3) -------公司名称长度绝对大于6,一般都在6以上 else substr(t.name,round(length(t.name)/2,0)-2)||substr(‘****‘,4-mod(length(t.name),2))||substr(t.name,-(round(length(t.name)/2,0)-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(‘****‘,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:用于填充的字符,可以不填,默认为空字符 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |