日期:2014-05-17  浏览次数:20950 次

oracle中null等于''?
真是越来越受不了oracle了,大家看下
SQL> create table aa (a varchar2(10) not null);

Table created

SQL> 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 dropped

SQL> create table aa (a varchar2(10) null);

Table created

SQL> insert into aa (a) values ('');

1 row inserted

SQL> select count(*) from aa where a is null;

  COUNT(*)
----------
  1

SQL> select count(*) from aa where a ='';

  COUNT(*)
----------
  0

我允许这个字符型字段可为空,并且插入一个空串,oracle把它当成了null来处理
所以where a is null条件成立了,可是,我的空串到哪去了??????
在oracle中,无论这个字段是否允许为空,我都无法正确保存一个''在这个字段里了。

请教一下大家,是我无知还是oracle错了?

------解决方案--------------------
Oracle 中,空字符串存入到Oracle中会自动转换为NULL,而其他DBMS,
如SQLserver就不是这样处理,空串存入就是空字符串,不等价于NULL.
------解决方案--------------------
想用oracle就去适应他吧,每种语言的处理都是不一样的。
------解决方案--------------------

  因为空值表示缺少数据,所以空值和其它值没有可比性,即不能用等于、不等于、大于或小于和其它数值比较,当然也包括空值本身(但是在decode中例外,两个空值被认为是等价)。测试空值只能用比较操作符IS NULL 和IS NOT NULL。如果使用带有其它比较操作符的条件表达式,并且其结果依赖于空值,那么其结果必定是NULL。在where条件中,Oracle认为结果为NULL的条件为FALSE,带有这样条件的select语句不返回行,也不返回错误信息。
SQL code

  
---------------------------------------
--测试
--  查询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的处理更方便不是吗,
用户才不关心是空串还是控值,看起来都是没数,差不离。
程序员更欢迎了,可以每次少写一个条件。
------解决方案--------------------
同意樓上!
------解决方案--------------------
搂住还是不太熟悉Oracle的处理策略。
而且,从物理模式去理解。
一个空的字符串就是什么都没有,oracle也什么都没有存。
你去出来比较的时候''就和null一样。
而SQLServer的做法是即使什么都没有,也要有一个字符串结束标记,至一点类似C语言的字符串处理。
两种方式,不好说谁好谁坏。只是见仁见智而已。


------解决方案--------------------
我不知道有啥地方麻烦,
大不了还有个函数叫nvl。
------解决方案--------------------
oracle 是这样的,空字符串就变成空了
------解决方案--------------------
用函数nvl
------解决方案--------------------
好像概念还是没有理解:就第一个例子,not null ,而你又insert 空,自己自相矛盾啊
------解决方案--------------------
某星球人习惯上给放屁增加了仪式来象征身份,脱了裤子放屁的跟不脱裤子放屁的是两种身份,大家习惯了,看到放屁的就问:脱了裤子放的还是穿着裤子放的?
有一天,地球人去做客,聊起某领导说话象放屁,该星球人马上下意识的问:脱裤子放的还是穿裤子放的?
地球人回答:就是放屁!

呵呵,习惯而已
有些语言习惯把什么都没有但没占位置和什么都没有但占了位置区分开,所有看到什么都没有,就习惯上问一下:是占位空还是不占位空?
有些语言习惯上就不给空的占位子,占不占位都当是空的,所以习惯前一种模式的人一时就不容易习惯了

------解决方案--------------------
只能漫漫适应oracle 的规则了
------解决方案--------------------
路过学习以下。这么说确实与mssql差别很大。
特别是在insert '' 这个情况.可是想不通为什么在where的条件下又变味了呢?
我想楼主也是这个意思吧。
------解决方案--------------------