我知道它确实考虑过'' NULL
,但这并没有太多告诉我为什么会这样.据我所知,SQL规范''与NULL
- 不一样- 一个是有效数据,另一个是缺少相同的信息.
随意推测,但请说明是否是这种情况.如果甲骨文的任何人都能评论它,那就太棒了!
我相信答案是Oracle非常非常老.
回到有过SQL标准的前几天,Oracle做出了设计决定,即VARCHAR
/ VARCHAR2
columns中的空字符串NULL
是唯一的,并且只有一种NULL感(有关系理论家可以区分从未提示过的数据,答案存在但用户不知道的数据,没有答案的数据等等,所有这些都构成了一种感觉NULL
.
当SQL标准出现并同意NULL
并且空字符串是不同的实体时,已经有Oracle用户拥有代码,假设这两者是等价的.因此Oracle基本上选择了破坏现有代码,违反SQL标准或引入某种初始化参数来改变潜在大量查询的功能.违反SQL标准(恕我直言)是这三个选项中破坏性最小的.
Oracle已经开放了这样一种可能性,即VARCHAR
数据类型将在未来版本中发生变化,以符合SQL标准(这就是为什么每个人都VARCHAR2
在Oracle中使用,因为数据类型的行为保证在未来保持不变).
Tom Kyte Oracle副总裁:
ZERO长度varchar被视为NULL.
''不被视为NULL.
''当分配给char(1)变为''时(char类型是空白填充字符串).
''当分配给varchar2(1)变为''时,它是一个零长度字符串,并且在Oracle中零长度字符串是NULL(它不长'')
我怀疑如果你像早期的开发人员那样想到Oracle,这会更有意义 - 作为数据输入系统的美化后端.数据库中的每个字段对应于数据输入操作员在其屏幕上看到的表单中的字段.如果操作员没有在字段中输入任何内容,无论是"生日"还是"地址",那么该字段的数据都是"未知".对于操作员来说,没有办法表明某人的地址确实是一个空字符串,而且这无论如何都没有多大意义.
Oracle文档提醒开发人员注意这个问题,至少可以追溯到版本7.
Oracle选择通过"不可能的价值"技术代表NULLS.例如,数字位置中的NULL将存储为"减零",这是一个不可能的值.计算产生的任何负零将在存储之前转换为正零.
Oracle也错误地选择将长度为零的VARCHAR字符串(空字符串)视为不可能的值,并且是表示NULL的合适选择.事实证明,空字符串远非一个不可能的值.它甚至是字符串连接操作下的身份!
Oracle文档警告数据库设计人员和开发人员,Oracle的某些未来版本可能会破坏空字符串与NULL之间的这种关联,并破坏依赖于该关联的任何代码.
除了不可能的值之外,还有一些标记NULLS的技术,但Oracle没有使用它们.
(我在上面使用"位置"一词表示行和列的交集.)