暂无图片
分享
周伟
2022-07-19
oracle is not null 过滤不了Null值

各位专家,

今天遇到一个比较奇怪的问题,我们的一个很简单的查询语句,在其中一个字段上添加了 is not null 的过滤条件,但是查询出来的结果里面,这个字段的其中一些值,无论怎么看都显示为空。通过对这些异常值的utl_raw.cast_to_raw 转换,或者dump函数转换的结果来看,无论怎么看他们都是空值。具体的可以看看截图。各位专家有没有碰到过这种情况的。oracle 11204版本,oracle linux系统。


收藏
分享
8条回答
默认
最新
王运亮
2022-07-20

select * from tb where field=chr(0);

oracle确实存在这个问题,参考:
https://www.modb.pro/db/33720

暂无图片 评论
暂无图片 有用 0
打赏 0
暂无图片
周伟
题主
2022-07-20
这个应该就是这个原因了,昨天式过chr(13),chr(10), 就是没想过chr(0), 谢了。
2022-07-19
字段='' or 字段 is not null
暂无图片 评论
暂无图片 有用 0
打赏 0
2022-07-19

字段为空和null不一样哦,你可以按这个: 字段!='' or 字段 is not null作为条件去掉

暂无图片 评论
暂无图片 有用 0
打赏 0
周伟
题主
2022-07-20
这个都试过,单独加 !='' 的过滤结果和is not null 是一样的,只是没尝试过两个一起加。目前已经手工强制修复这类数据为null了。
周伟
题主
2022-07-20
另外,如果我没记错的话,oracle 当中空字符串''会被强制转换为null值来处理。测试的情况来看也是这样的。因为尝试insert一个'',他的length结果就是空。而我们这个地方诡异的就是,长度为1,但是查出来的ascii码却是00,也就是空字符。。
赵勇
2022-07-19

推测你字段中的值并不是NULL,而是空格。
举例测试如下:

SQL> create table test_null(id number,c1 varchar2(16));

Table created.

SQL> insert into test_null values(1,NULL);

1 row created.

SQL> insert into test_null values(2,'');--无空格

1 row created.

SQL> insert into test_null values(3,' ');--有1个空格

1 row created.

SQL> commit;

Commit complete.

SQL> select id,dump(c1,1016) res,length(c1) from test_null;

        ID RES                                                          LENGTH(C1)
---------- ------------------------------------------------------------ ----------
         1 NULL
         2 NULL
         3 Typ=1 Len=1 CharacterSet=AL32UTF8: 20                                 1

SQL> 

暂无图片 评论
暂无图片 有用 0
打赏 0
周伟
题主
2022-07-20
这三种情况都排查过了,长度为,ASCII为00,就是空字符
赵勇
答主
2022-07-21
从前边的实验可见,NULL的长度应为空,而不是1.有长度,一定是非NULL。
王运亮
2022-07-19

查下长度,查下ascii码(可能是不可见字符):

select length(c_customer_accounts),ascii(c_customer_accounts) from dual;

暂无图片 评论
暂无图片 有用 0
打赏 0
周伟
题主
2022-07-20
查过了,ASCII码就是00,对应的就是空字符,长度为1
刘晓华
2022-07-20

dump一下,看下里面到底是什么,对照ASCII码表去看就知道是什么啦!


select c_customer_accounts,dump(c_customer_accounts)  from your_table ....

暂无图片 评论
暂无图片 有用 0
打赏 0
周伟
题主
2022-07-20
查过了,dump出来的码对照的ASCII就是空字符
刘晓华
答主
2022-07-20
那不就知道了么。。。
薛晓刚
2022-07-20

有可能是个回车

暂无图片 评论
暂无图片 有用 0
打赏 0
周伟
题主
2022-07-20
回车,换行都排查过了。。
周伟
2022-07-20
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏