Oracle通过sql语句过滤ASCII控制字符

首先我们聊一聊ASCII控制字符,这些控制字符是不可见的,可以理解为一种特殊字符,而这种字符是可以被存入Oracle表中的。

项目中遇到了这样一种情况,java程序从Oracle表中取数据并解析为xml时产生了报错信息,原因是表内存在无法被解析为xml的特殊字符,后来导出数据后使用notepad++工具查看时才发现存在ASCII控制字符。注意,这些ASCII控制字符是无法被xml解析的,所以需要想办法将其过滤。

 

ASCII控制字符

二进制十进制十六进制缩写可以显示的表示法名称/意义
0000 0000000NUL空字符(Null)
0000 0001101SOH标题开始
0000 0010202STX本文开始
0000 0011303ETX本文结束
0000 0100404EOT传输结束
0000 0101505ENQ请求
0000 0110606ACK确认回应
0000 0111707BEL响铃
0000 1000808BS退格
0000 1001909HT水平定位符号
0000 1010100ALF换行键
0000 1011110BVT垂直定位符号
0000 1100120CFF换页键
0000 1101130DCR归位键
0000 1110140ESO取消变换(Shift out)
0000 1111150FSI启用变换(Shift in)
0001 00001610DLE跳出数据通讯
0001 00011711DC1设备控制一(XON 启用软件速度控制)
0001 00101812DC2设备控制二
0001 00111913DC3设备控制三(XOFF 停用软件速度控制)
0001 01002014DC4设备控制四
0001 01012115NAK确认失败回应
0001 01102216SYN同步用暂停
0001 01112317ETB区块传输结束
0001 10002418CAN取消
0001 10012519EM连接介质中断
0001 1010261ASUB替换
0001 1011271BESC跳出
0001 1100281CFS文件分割符
0001 1101291DGS组群分隔符
0001 1110301ERS记录分隔符
0001 1111311FUS单元分隔符
0111 11111277FDEL删除

 

那么,如何过滤掉这些ASCII控制字符呢。

 

方法1:通过java程序直接过滤掉ASCII控制字符。

此方法仅可用于方便变更java代码的情况,本文不作描述。而当无法动java代码时,我们就需要从sql的角度去过滤掉这些ASCII控制字符了,可以参考如下方法。

 

方法2:通过sql去过滤ASCII控制字符。

我们可以通过语句来确认ASCII的序号。

select ascii('') from dual;  --此处无法正常显示,可参考截图
select chr(2) from dual;

可以得知该ASCII控制字符对应的十进制数为2。我们将这个特殊字符拷贝至notepad++,发现对应以上表格内的可显示字符为'stx',与语句查出来的10进制数一致。

所以我们可以通过translate函数来批量过滤特殊字符:

translate('目标字段',
chr(0)||chr(1)||chr(2)||chr(3)||chr(4)||chr(5)||chr(6)||chr(7)||chr(8)||chr(9)||
chr(10)||chr(11)||chr(12)||chr(13)||chr(14)||chr(15)||chr(16)||chr(17)||chr(18)||chr(19)||
chr(20)||chr(21)||chr(22)||chr(23)||chr(24)||chr(25)||chr(26)||chr(27)||chr(28)||chr(29)||chr(30)||chr(31)
,' ')

注意以上最后一行单引号内有个'空格',如果不加空格将无法实现替换操作。

这样我们就可以批量的过滤掉ASCII控制字符了。

我们可以通过查询系统dual表的方式验证一下语句的准确性:

 

这样我们就可以很轻松的从数据库内取值时过滤掉无法解析为xml字符串的ASCII控制字符了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值