我知道它确实认为' '为NULL,但这并没有告诉我为什么会这样。根据我对SQL规范的理解,' '与NULL不一样——一个是有效的数据,另一个是表明没有相同的信息。
请随意猜测,但如果是这样,请指出来。如果甲骨文有谁能对此发表评论,那就太棒了!
我知道它确实认为' '为NULL,但这并没有告诉我为什么会这样。根据我对SQL规范的理解,' '与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;
根据官方的11g文件
Oracle数据库当前将长度为0的字符值视为null。然而,在未来的版本中可能不会继续如此,Oracle建议您不要将空字符串视为null。
可能的原因
val IS NOT NULL比val更可读!= " 不需要检查val != "和val IS NOT NULL这两个条件
甲骨文公司副总裁汤姆·凯特:
长度为0的varchar被视为 NULL。 不被视为NULL。 当赋值给char(1)时变成 ' '(字符类型是空白填充的 字符串)。 当分配给varchar2(1)时 变成",长度为零 字符串和零长度的字符串是 Oracle中的NULL(它不是长”)
我相信答案是甲骨文非常非常古老。
早在SQL标准出现之前,Oracle的设计决定是VARCHAR/VARCHAR2列中的空字符串为NULL,并且只有一种意义上的NULL(有关系理论家会区分从未提示的数据、存在答案但用户不知道的数据、没有答案的数据等等,所有这些都构成了某种意义上的NULL)。
By the time that the SQL standard came around and agreed that NULL and the empty string were distinct entities, there were already Oracle users that had code that assumed the two were equivalent. So Oracle was basically left with the options of breaking existing code, violating the SQL standard, or introducing some sort of initialization parameter that would change the functionality of potentially large number of queries. Violating the SQL standard (IMHO) was the least disruptive of these three options.
Oracle保留了在未来的版本中更改VARCHAR数据类型以遵循SQL标准的可能性(这就是为什么每个人都在Oracle中使用VARCHAR2,因为数据类型的行为保证在未来保持不变)。
首先,null和空字符串在Oracle中并不总是被视为相同的。根据定义,空字符串是不包含字符的字符串。这和null完全不一样。根据定义,NULL表示没有数据。
大约在五六年以前,Oracle对空字符串的处理与null是不同的。然而,像null一样,null字符串等于所有东西,不同于所有东西(我认为这对null来说很好,但对null字符串来说完全错误),至少长度(null字符串)会返回0,因为它应该因为null字符串是一个零长度的字符串。
目前在Oracle中,长度(null)返回null,我猜是可以的,但长度(空字符串)也返回null,这是完全错误的。
我不明白为什么他们决定把这两种不同的“价值观”一视同仁。它们意味着不同的东西,程序员应该有能力以不同的方式处理它们。他们改变了他们的方法,这一事实告诉我,他们真的不知道应该如何对待这些价值。