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