真是越来越受不了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错了?

解决方案 »

  1.   

    Oracle 中,空字符串存入到Oracle中会自动转换为NULL,而其他DBMS,
    如SQLserver就不是这样处理,空串存入就是空字符串,不等价于NULL.
      

  2.   

    想用oracle就去适应他吧,每种语言的处理都是不一样的。
      

  3.   


      因为空值表示缺少数据,所以空值和其它值没有可比性,即不能用等于、不等于、大于或小于和其它数值比较,当然也包括空值本身(但是在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为空值的行。
      

  4.   

    显然oracle的处理更方便不是吗,
    用户才不关心是空串还是控值,看起来都是没数,差不离。
    程序员更欢迎了,可以每次少写一个条件。
      

  5.   

    搂住还是不太熟悉Oracle的处理策略。
    而且,从物理模式去理解。
    一个空的字符串就是什么都没有,oracle也什么都没有存。
    你去出来比较的时候''就和null一样。
    而SQLServer的做法是即使什么都没有,也要有一个字符串结束标记,至一点类似C语言的字符串处理。
    两种方式,不好说谁好谁坏。只是见仁见智而已。
      

  6.   

    晕死,程序员不是可以少写一个条件,是更麻烦了。
    一个字段,比如地址,有可能客户没有填写,那就是空串''
    这样一来这个字段在oracle中一定要允许为空,否则''无法保存到表中
    这个字段允许为空,select 这个字段的时候就取出了空值
    pro*c中空值需要特殊处理,否则报错,相当的麻烦换句话说,oracle这样处理并不是更方便,而实际上是强制我需要处理空值
    不是一般的麻烦。
      

  7.   

    分数是多,回答结果也多,可为什么就看到大家的得分都为:0呢。UP↑UP↑
      

  8.   

    我不知道有啥地方麻烦,
    大不了还有个函数叫nvl。
      

  9.   

    oracle 是这样的,空字符串就变成空了
      

  10.   

    一张表20个字段
    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这里是不是处理错了,
    还抱了点小小的希望可以设置一个什么参数解决这个问题,
    看来是不行了。
      

  11.   

    好像概念还是没有理解:就第一个例子,not null ,而你又insert 空,自己自相矛盾啊
      

  12.   

    只能漫漫适应oracle 的规则了
      

  13.   

    路过学习以下。这么说确实与mssql差别很大。
    特别是在insert '' 这个情况.可是想不通为什么在where的条件下又变味了呢?
    我想楼主也是这个意思吧。
      

  14.   

    oracle 还有一个 three values logic 的问题,把 boolean 变量的 null 值当作 false 处理。
      

  15.   

    关于这个问题,首先是版本的问题.9i以前的是可以存入 ' ',但是之后都会当作Null处理.
    如果需要插入 ' '(空格),请调整语句insert into aa(a) values(chr(20));
      

  16.   

    如果你的字段类型是char 或者nchar,则不存在上述问题.
      

  17.   

    这个不是有些语言这样,有些语言那样的问题
    而是绝大多数数据库都可以正确分辨null和空串,目前我只看到oracle无法分辨null和空串
    随便去找本数据库的书籍,甚至是专门讲oracle的书也行,所有的书都在强调空串不等于null,
    我刚刚把我把能找到的相关书籍都翻了一下,没看到过哪本书上说过有什么特殊性
    楼上觉得oracle这样处理也很正确的兄弟们,谁以前在书上看到过插入空串相当于插入null的,
    举出来让我见识下好不好?要是找不到这样的书籍资料,那我只能说:
    oracle严重违背常理我发这个帖子实际上也想提醒下大家,oracle这里处理和别人不一样,小心点别搞错了。
      

  18.   

    select nvl(a, ' '),nvl(b, ' '),nvl(c, ' '),nvl(d, ' '),..... from table; 
    麻烦还是
    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 
    麻烦?
      

  19.   

    我并没有说nvl函数麻烦。一般来说也不需要判断
    a is null or a=''
    因为空和空串意义是不同的。
    事实上我的字段并不需要null,换句话说我希望这个字段非空,但是允许空串''
    在oracle中你做不到这一点,如果一个字段非空,那么空串也保存不进去,至少要加个空格才可以
    对我这样严谨的人来说,oracle的这个特性实在是让人bs。还不明白的话我可以再详细点说
    大多数情况下,我们并不需要处理null,所以我不想设置字段允许null,可是,如果不设置字段允许null,
    我就无法保存空串到这个字段中,我不需要处理null,可是我需要处理空串啊
    只有被迫设置字段允许null。。实在是有被强奸的感觉
    设置字段允许null了可以保存空串到这个字段了,可是保存了空串进去我无法用where 字段=''来检索,必须用
    where 字段 is null来检索。又被强奸了一次
      

  20.   

    不讨论这样处理是否好的问题。只是针对楼主的例子:比如地址,有可能客户没有填写,那就是空串 ' ' 做一些讨论:如果客户是必填字段,那么不存在填入空串的可能性,因为你没有办法输入空串,而必须输入一个值;
    如果客户是选填字段,那么要么输入一个值,要么不输入(不输入当然就是null,这是null的基本概念),也不存在空串的可能性。所以楼主的这个例子没有任何参考价值。
      

  21.   

    同意楼主的观点,null就是null,空串就是空串,无论如何Oracle作为一种存储仓库,不应该擅自改变用户的意图。
      

  22.   

    null 和 空不一样撒 
    来考试成绩来说 考试得0分 和没有参加考试 是两码事
    0 和 null 不加以区分那
      

  23.   

    同意楼主,这点ORACLE处理得很不好,给程序员添麻烦
      

  24.   

    Oracle Database currently treats a character value with a length of zero as null. However, this may not continue to be true in future releases, and Oracle recommends that you do not treat empty strings the same as nulls.