真是越来越受不了oracle了,大家看下
SQL> create table aa (a varchar2(10) not null);Table createdSQL> insert into aa (a) values ('');insert into aa (a) values ('')ORA-01400: cannot insert NULL into ("CC"."AA"."A")在oracle看来,''就是空值,所以一个非空字符字段就无法插入空字符串了。所有的教科书都告诉我们,null是个特殊的值,它不等于0,也不等于空串,它不等于任何值,也不不等于任何值。
嗯,原则到了oracle这里失败了。再看下以下语句
SQL> drop table aa;Table droppedSQL> create table aa (a varchar2(10) null);Table createdSQL> insert into aa (a) values ('');1 row insertedSQL> select count(*) from aa where a is null; COUNT(*)
----------
1SQL> select count(*) from aa where a =''; COUNT(*)
----------
0我允许这个字符型字段可为空,并且插入一个空串,oracle把它当成了null来处理
所以where a is null条件成立了,可是,我的空串到哪去了??????
在oracle中,无论这个字段是否允许为空,我都无法正确保存一个''在这个字段里了。请教一下大家,是我无知还是oracle错了?
SQL> create table aa (a varchar2(10) not null);Table createdSQL> insert into aa (a) values ('');insert into aa (a) values ('')ORA-01400: cannot insert NULL into ("CC"."AA"."A")在oracle看来,''就是空值,所以一个非空字符字段就无法插入空字符串了。所有的教科书都告诉我们,null是个特殊的值,它不等于0,也不等于空串,它不等于任何值,也不不等于任何值。
嗯,原则到了oracle这里失败了。再看下以下语句
SQL> drop table aa;Table droppedSQL> create table aa (a varchar2(10) null);Table createdSQL> insert into aa (a) values ('');1 row insertedSQL> select count(*) from aa where a is null; COUNT(*)
----------
1SQL> select count(*) from aa where a =''; COUNT(*)
----------
0我允许这个字符型字段可为空,并且插入一个空串,oracle把它当成了null来处理
所以where a is null条件成立了,可是,我的空串到哪去了??????
在oracle中,无论这个字段是否允许为空,我都无法正确保存一个''在这个字段里了。请教一下大家,是我无知还是oracle错了?
如SQLserver就不是这样处理,空串存入就是空字符串,不等价于NULL.
因为空值表示缺少数据,所以空值和其它值没有可比性,即不能用等于、不等于、大于或小于和其它数值比较,当然也包括空值本身(但是在decode中例外,两个空值被认为是等价)。测试空值只能用比较操作符IS NULL 和IS NOT NULL。如果使用带有其它比较操作符的条件表达式,并且其结果依赖于空值,那么其结果必定是NULL。在where条件中,Oracle认为结果为NULL的条件为FALSE,带有这样条件的select语句不返回行,也不返回错误信息。
---------------------------------------
--测试
-- 查询EMP表中MGR为NULL的行:
SQL>select * from emp where mgr='';
no rows selected
SQL>select * from emp where mgr=null;
no rows selected
SQL>select * from emp where mgr is null;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------- ---------- --------- --------- --------- --------- --------- ---------
7839 KING PRESIDENT 17-NOV-81 5000 10
-- 第1、2句写法有问题,WHERE条件结果为NULL,不返回行。第三句正确,返回MGR为空值的行。
用户才不关心是空串还是控值,看起来都是没数,差不离。
程序员更欢迎了,可以每次少写一个条件。
而且,从物理模式去理解。
一个空的字符串就是什么都没有,oracle也什么都没有存。
你去出来比较的时候''就和null一样。
而SQLServer的做法是即使什么都没有,也要有一个字符串结束标记,至一点类似C语言的字符串处理。
两种方式,不好说谁好谁坏。只是见仁见智而已。
一个字段,比如地址,有可能客户没有填写,那就是空串''
这样一来这个字段在oracle中一定要允许为空,否则''无法保存到表中
这个字段允许为空,select 这个字段的时候就取出了空值
pro*c中空值需要特殊处理,否则报错,相当的麻烦换句话说,oracle这样处理并不是更方便,而实际上是强制我需要处理空值
不是一般的麻烦。
大不了还有个函数叫nvl。
select a,b,c,d,e,f,g ..... from table;
变成
select nvl(a,''),nvl(b,''),nvl(c,''),nvl(d,''),..... from table;
这个还不叫麻烦?
空串是空串,null是null,oracle把这两者搞混淆了
估计oracle多半是最初的版本做的笨了,后来为了兼容性考虑,只有一路错下去。
我发贴子只是想看下oracle这里是不是处理错了,
还抱了点小小的希望可以设置一个什么参数解决这个问题,
看来是不行了。
特别是在insert '' 这个情况.可是想不通为什么在where的条件下又变味了呢?
我想楼主也是这个意思吧。
如果需要插入 ' '(空格),请调整语句insert into aa(a) values(chr(20));
而是绝大多数数据库都可以正确分辨null和空串,目前我只看到oracle无法分辨null和空串
随便去找本数据库的书籍,甚至是专门讲oracle的书也行,所有的书都在强调空串不等于null,
我刚刚把我把能找到的相关书籍都翻了一下,没看到过哪本书上说过有什么特殊性
楼上觉得oracle这样处理也很正确的兄弟们,谁以前在书上看到过插入空串相当于插入null的,
举出来让我见识下好不好?要是找不到这样的书籍资料,那我只能说:
oracle严重违背常理我发这个帖子实际上也想提醒下大家,oracle这里处理和别人不一样,小心点别搞错了。
麻烦还是
select * from tale
where (a is null or a = '' )and
(b is null or b = '') and
(c is null or c = '' )and
(d is null or d = '' )and
(e is null or e = '' )and
(f is null or f = '' )and
(g is null or g = '' )and
麻烦?
a is null or a=''
因为空和空串意义是不同的。
事实上我的字段并不需要null,换句话说我希望这个字段非空,但是允许空串''
在oracle中你做不到这一点,如果一个字段非空,那么空串也保存不进去,至少要加个空格才可以
对我这样严谨的人来说,oracle的这个特性实在是让人bs。还不明白的话我可以再详细点说
大多数情况下,我们并不需要处理null,所以我不想设置字段允许null,可是,如果不设置字段允许null,
我就无法保存空串到这个字段中,我不需要处理null,可是我需要处理空串啊
只有被迫设置字段允许null。。实在是有被强奸的感觉
设置字段允许null了可以保存空串到这个字段了,可是保存了空串进去我无法用where 字段=''来检索,必须用
where 字段 is null来检索。又被强奸了一次
如果客户是选填字段,那么要么输入一个值,要么不输入(不输入当然就是null,这是null的基本概念),也不存在空串的可能性。所以楼主的这个例子没有任何参考价值。
来考试成绩来说 考试得0分 和没有参加考试 是两码事
0 和 null 不加以区分那