ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于Oracle字段存储时的不可见字符

关于Oracle字段存储时的不可见字符

原创 Linux操作系统 作者:is.x 时间:2012-01-11 14:49:08 0 删除 编辑

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

 

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 NAME     LENGTH(NAME) RAWTOHEX(NAME)   DUMP(NAME)

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

         1                                        NULL

         2                                        NULL

         3                     1 20               Typ=1 Len=1: 32

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

 

看出来了吗?第4条记录中存储的其实是816进制的字符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

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

 

        ID NAME

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

         4

 

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

 

        ID NAME

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

         4

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20750200/viewspace-714740/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-04-27

  • 博文量
    73
  • 访问量
    244824