我知道它确实认为' '为NULL,但这并没有告诉我为什么会这样。根据我对SQL规范的理解,' '与NULL不一样——一个是有效的数据,另一个是表明没有相同的信息。
请随意猜测,但如果是这样,请指出来。如果甲骨文有谁能对此发表评论,那就太棒了!
我知道它确实认为' '为NULL,但这并没有告诉我为什么会这样。根据我对SQL规范的理解,' '与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;
其他回答
甲骨文公司副总裁汤姆·凯特:
长度为0的varchar被视为 NULL。 不被视为NULL。 当赋值给char(1)时变成 ' '(字符类型是空白填充的 字符串)。 当分配给varchar2(1)时 变成",长度为零 字符串和零长度的字符串是 Oracle中的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相同,因为与两者(空字符串和NULL)不相同的情况相比,它是“较轻的邪恶”。
在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;
根据官方的11g文件
Oracle数据库当前将长度为0的字符值视为null。然而,在未来的版本中可能不会继续如此,Oracle建议您不要将空字符串视为null。
可能的原因
val IS NOT NULL比val更可读!= " 不需要检查val != "和val IS NOT NULL这两个条件