oracle 查询字符16进制,关于Oracle字段存储时的不可见字符

因为最近遇到了表字段中存储有多个十六进制绝对零问题,所以在测试环境模拟了一下,首先来看建表语句:

create table t (id number,name varchar(8));

没有问题,接着我们来看看表中的具体内容

SQL> select * from t order by id;

ID NAME

---------- --------

1

2

3

4

四条记录看上去均无数据,那么来看看它们是什么?

SQL> select id,name from t where name is null;

ID NAME

---------- --------

1

2

SQL> select id,name from t where name like '% %';

ID NAME

---------- --------

3

1,2条记录看上去name字段是null,第3条记录name字段应该是由一个或多个空格组成,那么第4条记录呢?它到底是什么?如何把它查询出来呢?

SQL> select id,name,length(name),rawtohex(name),dump(name) from t order by id;

ID NAMELENGTH(NAME) RAWTOHEX(NAME)DUMP(NAME)

---------- -------- ------------ ---------------- ----------------------------------------

1NULL

2NULL

31 20Typ=1 Len=1: 32

44 00000000Typ=1 Len=4: 0,0,0,0

看出来了吗?第4条记录中存储的其实是8个16进制的字符0,这样存储的字符不但不可见,而且用上述的匹配符还无法查询出,真是相当头疼的事情。以下是我模拟实验时插入数据的语句:

SQL> insert into t values(1,null);

SQL> insert into t values(2,'');

SQL> insert into t values(3,' ');

SQL> insert into t values(4,UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('00000000')));

SQL> commit;

Commit complete.

要想查询出记录4,可以使用下面的方法:

SQL> select * from t

2where name=UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('00000000'));

ID NAME

---------- --------

4

SQL> select * from t where rawtohex(name) like '%00%';

ID NAME

---------- --------

4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值