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

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


当前回答

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

长度为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

Oracle文档提醒开发人员注意这个问题,至少可以追溯到版本7。

Oracle选择用“不可能值”技术来表示null。例如,数值位置中的NULL将被存储为“负零”,这是一个不可能的值。任何由计算产生的负0将在存储之前转换为正0。

Oracle还错误地认为长度为0的VARCHAR字符串(空字符串)是一个不可能的值,并且是表示NULL的合适选择。事实证明,空字符串远非一个不可能的值。它甚至是字符串连接操作下的恒等式!

Oracle文档警告数据库设计人员和开发人员,Oracle的某些未来版本可能会出现这种情况 打破空字符串和NULL之间的这种关联,并打破依赖于这种关联的任何代码。

除了不可能的值之外,还有一些技术可以标记null,但Oracle没有使用它们。

(我上面用的“位置”这个词是指行和列的交点。)

I suspect this makes a lot more sense if you think of Oracle the way earlier developers probably did -- as a glorified backend for a data entry system. Every field in the database corresponded to a field in a form that a data entry operator saw on his screen. If the operator didn't type anything into a field, whether that's "birthdate" or "address" then the data for that field is "unknown". There's no way for an operator to indicate that someone's address is really an empty string, and that doesn't really make much sense anyways.

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

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

首先,null和空字符串在Oracle中并不总是被视为相同的。根据定义,空字符串是不包含字符的字符串。这和null完全不一样。根据定义,NULL表示没有数据。

大约在五六年以前,Oracle对空字符串的处理与null是不同的。然而,像null一样,null字符串等于所有东西,不同于所有东西(我认为这对null来说很好,但对null字符串来说完全错误),至少长度(null字符串)会返回0,因为它应该因为null字符串是一个零长度的字符串。

目前在Oracle中,长度(null)返回null,我猜是可以的,但长度(空字符串)也返回null,这是完全错误的。

我不明白为什么他们决定把这两种不同的“价值观”一视同仁。它们意味着不同的东西,程序员应该有能力以不同的方式处理它们。他们改变了他们的方法,这一事实告诉我,他们真的不知道应该如何对待这些价值。