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(‘**‘,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:用于填充的字符,可以不填,默认为空字符

原文地址:https://www.cnblogs.com/chenlu-vera/p/9519107.html

时间: 2024-10-09 11:40:06

Oracle汉字用户名数据脱敏长度不变,rpad函数使用的相关文章

什么是数据脱敏?

百度百科是这样描述的: 数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护.在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如×××号.手机号.卡号.客户姓名.客户地址.等个人敏感信息都需要通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护.这样就可以在开发.测试和其他非生产环境以及外包环境中可以安全的使用脱敏后的真实数据集. 生活中的常见例子 1.火车票: 2.淘宝网页上的收获地址信息: 敏感数据梳理

工具类-数据脱敏

针对姓名.电话.地址.邮箱等敏感信息进行脱敏操作,代码如下: 1 import org.apache.commons.lang.StringUtils; 2 3 /** 4 * 数据脱敏工具类 5 * Created by shenruihai on 2018/06/13. 6 */ 7 public class Desensitized { 8 9 /** 10 * [中文姓名]只显示第一个汉字,其他隐藏为2个星号,比如:李** 11 * 12 * @param fullName 13 * @

Java 数据脱敏

数据脱敏 数据脱敏又称数据去隐私化或数据变形,是在给定的规则.策略下对敏感数据进行变换.修改的技术机制,能够在很大程度上解决敏感数据在非可信环境中使用的问题.根据数据保护规范和脱敏策略.对业务数据中的敏感信息实施自动变形.实现对敏感信息的隐藏. 脱敏方法 项目是在controller层进行脱敏,查阅google和github有两种较为方便的方法 一种是基于注解 desensitized基于注解的形式进行脱敏 GitHub 一种是基于框架本质上还是注解,但是已经封装好了,当然还提供fastjson

Oracle 汉字在不同字符集下所占字节

今天发现了一个问题,一个长度设置为2000字节的字段,插入一条长度为1000的汉字数据,竟然报错了. 一个汉字占两个字节,按理说刚好是2000个字节.但通过查看日志,发现插入数据的长度为3000字节. 百度了一下,原来是不同的字符集造成的. 一般情况下,数据库的NLS_CHARACTERSET 为AL32UTF8或UTF8,即一个汉字占用三到四个字节.如果NLS_CHARACTERSET为ZHS16GBK,则一个字符占用两个字节. 而公司的运行环境上是AL32UTF8,因此一个汉字占到了3个字节

oracle更改用户名

项目中已经建好数据库表,可是突然需要更改用户名.通过plsql客户端界面形式是不可改的.所以直接更改系统user$表中的用户名. 查询要更改的用户名 SQL> select user#,name,password from user$ where name  ='TICKETS'; USER# NAME                           PASSWORD ----------  ------------------------------ -------------------

oracle中的数据对象

oracle中的数据对象有表.视图.索引.序列等 表的相关操作 1.创建表 方式一: 方式二:create table person( create table person1 id number(18), as name varchar2(5), select * from person age number(3), sex varchar2(4) ); 2.删除表 方式一:只会删除表中的内容,不会删除表结构truncate delete 方式二:删除表结构truncate table per

ORACLE 更改用户名

以前一直经常修改oracle的用户密码,但很少修改用户名的. 以前只能创建一个用户1,然后将用户2数据导入到用户1,然后经用户1删掉,这样非常麻烦而且耗时,今天就整理了下如何修改Oracle的用户名: 1.用sysdba角色账号进入,然后查询有哪些用户: SELECT * FROM user$ 2.找到需要修改的用户(user#字段是唯一标识) SELECT * FROM user$ WHERE user#=71 3.修改需要更改的用户名 UPDATE USER$ SET NAME='新的用户名

[转]Oracle DB 管理数据并发处理

? 描述锁定机制以及Oracle 如何管理数据并发处理 ? 使用SQL 管理数据 ? 识别和管理PL/SQL  对象 ? 描述触发器和触发事件 ? 监视和解决锁定冲突 通过SQL 处理数据 在数据库中使用基本数据操纵语言(DML) 语句来处理数据. INSERT 命令 ? 一次创建一行. ? 插入另一个表中的多行. 使用基本的INSERT 语句一次可创建一行.如果使用所谓的子选择,则可以使用INSERT命令将一个表中的若干行复制到另一个表.这种方法又称为INSERT SELECT 语句. 如以下

【应用】:shell crontab定时生成oracle表的数据到txt文件,并上传到ftp

一.本人环境描述      1.oracle服务端装在win7 32位上,oracle版本为10.2.0.1.0      2.Linux为centos6.5 32位,安装在Oracle VM VirtualBox虚拟机上      3.win7上装有ftp服务 二.功能实现描述      用shell的crontab命令定时执行某个.sh文件,此文件的功能已实现生成oracle表的数据到本地txt文件,并上传到ftp,必要时可记录执行日志. 三.步骤      1.在centos中安装orac