我知道它确实认为' '为NULL,但这并没有告诉我为什么会这样。根据我对SQL规范的理解,' '与NULL不一样——一个是有效的数据,另一个是表明没有相同的信息。

请随意猜测,但如果是这样,请指出来。如果甲骨文有谁能对此发表评论,那就太棒了!


当前回答

甲骨文公司副总裁汤姆·凯特:

长度为0的varchar被视为 NULL。 不被视为NULL。 当赋值给char(1)时变成 ' '(字符类型是空白填充的 字符串)。 当分配给varchar2(1)时 变成",长度为零 字符串和零长度的字符串是 Oracle中的NULL(它不是长”)

其他回答

书中的例子

   set serveroutput on;   
    DECLARE
    empty_varchar2 VARCHAR2(10) := '';
    empty_char CHAR(10) := '';
    BEGIN
    IF empty_varchar2 IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('empty_varchar2 is NULL');
    END IF;


    IF '' IS NULL THEN
    DBMS_OUTPUT.PUT_LINE(''''' is NULL');
    END IF;

    IF empty_char IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('empty_char is NULL');
    ELSIF empty_char IS NOT NULL THEN
    DBMS_OUTPUT.PUT_LINE('empty_char is NOT NULL');
    END IF;

    END;

空字符串与NULL相同,因为与两者(空字符串和NULL)不相同的情况相比,它是“较轻的邪恶”。

在NULL和空字符串不相同的语言中,必须始终检查这两个条件。

事实上,我在处理Oracle时遇到了困难,包括无效的datetime值(不能打印,转换或任何东西,只是用DUMP()函数查看),允许将其插入到数据库中,显然是通过一些有bug的客户端版本作为二进制列!保护数据库完整性就说这么多!

Oracle对null链接的处理:

http://digitalbush.com/2007/10/27/oracle-9i-null-behavior/

http://jeffkemponoracle.com/2006/02/empty-string-andor-null.html

因为不将其处理为NULL也不是特别有用。

如果你在Oracle上在这方面犯了错误,你通常会马上注意到。然而,在SQL server中,它似乎是可以工作的,并且只有当有人输入空字符串而不是NULL时才会出现问题(可能来自。net客户端库,其中NULL与“”不同,但您通常将它们视为相同的)。

我并不是说甲骨文是对的,但在我看来,这两种方法都差不多一样糟糕。

根据官方的11g文件

Oracle数据库当前将长度为0的字符值视为null。然而,在未来的版本中可能不会继续如此,Oracle建议您不要将空字符串视为null。

可能的原因

val IS NOT NULL比val更可读!= " 不需要检查val != "和val IS NOT NULL这两个条件