我知道它确实认为' '为NULL,但这并没有告诉我为什么会这样。根据我对SQL规范的理解,' '与NULL不一样——一个是有效的数据,另一个是表明没有相同的信息。
请随意猜测,但如果是这样,请指出来。如果甲骨文有谁能对此发表评论,那就太棒了!
我知道它确实认为' '为NULL,但这并没有告诉我为什么会这样。根据我对SQL规范的理解,' '与NULL不一样——一个是有效的数据,另一个是表明没有相同的信息。
请随意猜测,但如果是这样,请指出来。如果甲骨文有谁能对此发表评论,那就太棒了!
当前回答
因为不将其处理为NULL也不是特别有用。
如果你在Oracle上在这方面犯了错误,你通常会马上注意到。然而,在SQL server中,它似乎是可以工作的,并且只有当有人输入空字符串而不是NULL时才会出现问题(可能来自。net客户端库,其中NULL与“”不同,但您通常将它们视为相同的)。
我并不是说甲骨文是对的,但在我看来,这两种方法都差不多一样糟糕。
其他回答
甲骨文公司副总裁汤姆·凯特:
长度为0的varchar被视为 NULL。 不被视为NULL。 当赋值给char(1)时变成 ' '(字符类型是空白填充的 字符串)。 当分配给varchar2(1)时 变成",长度为零 字符串和零长度的字符串是 Oracle中的NULL(它不是长”)
空字符串与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;
Oracle文档提醒开发人员注意这个问题,至少可以追溯到版本7。
Oracle选择用“不可能值”技术来表示null。例如,数值位置中的NULL将被存储为“负零”,这是一个不可能的值。任何由计算产生的负0将在存储之前转换为正0。
Oracle还错误地认为长度为0的VARCHAR字符串(空字符串)是一个不可能的值,并且是表示NULL的合适选择。事实证明,空字符串远非一个不可能的值。它甚至是字符串连接操作下的恒等式!
Oracle文档警告数据库设计人员和开发人员,Oracle的某些未来版本可能会出现这种情况 打破空字符串和NULL之间的这种关联,并打破依赖于这种关联的任何代码。
除了不可能的值之外,还有一些技术可以标记null,但Oracle没有使用它们。
(我上面用的“位置”这个词是指行和列的交点。)
因为不将其处理为NULL也不是特别有用。
如果你在Oracle上在这方面犯了错误,你通常会马上注意到。然而,在SQL server中,它似乎是可以工作的,并且只有当有人输入空字符串而不是NULL时才会出现问题(可能来自。net客户端库,其中NULL与“”不同,但您通常将它们视为相同的)。
我并不是说甲骨文是对的,但在我看来,这两种方法都差不多一样糟糕。