当前位置:  开发笔记 > 数据库 > 正文

为什么Oracle 9i将空字符串视为NULL?

如何解决《为什么Oracle9i将空字符串视为NULL?》经验,为你挑选了4个好方法。

我知道它确实考虑过'' NULL,但这并没有太多告诉我为什么会这样.据我所知,SQL规范''与NULL- 不一样- 一个是有效数据,另一个是缺少相同的信息.

随意推测,但请说明是否是这种情况.如果甲骨文的任何人都能评论它,那就太棒了!



1> Justin Cave..:

我相信答案是Oracle非常非常老.

回到有过SQL标准的前几天,Oracle做出了设计决定,即VARCHAR/ VARCHAR2columns中的空字符串NULL是唯一的,并且只有一种NULL感(有关系理论家可以区分从未提示过的数据,答案存在但用户不知道的数据,没有答案的数据等等,所有这些都构成了一种感觉NULL.

当SQL标准出现并同意NULL并且空字符串是不同的实体时,已经有Oracle用户拥有代码,假设这两者是等价的.因此Oracle基本上选择了破坏现有代码,违反SQL标准或引入某种初始化参数来改变潜在大量查询的功能.违反SQL标准(恕我直言)是这三个选项中破坏性最小的.

Oracle已经开放了这样一种可能性,即VARCHAR数据类型将在未来版本中发生变化,以符合SQL标准(这就是为什么每个人都VARCHAR2在Oracle中使用,因为数据类型的行为保证在未来保持不变).



2> Brian..:

Tom Kyte Oracle副总裁:

ZERO长度varchar被视为NULL.

''不被视为NULL.

''当分配给char(1)变为''时(char类型是空白填充字符串).

''当分配给varchar2(1)变为''时,它是一个零长度字符串,并且在Oracle中零长度字符串是NULL(它不长'')


哇,汤姆非常讽刺.鉴于这些问题与SQL92的一个令人震惊的分歧有关,你会认为他对此不那么有力......虽然他可能厌倦了回答.
关于汤姆的最好的事情是你得到一个明确的答案,其中**确切地说**他的想法.寻找一些人们使用文字在Ask Tom上发表评论的评论
但如果将第二行更改为*''并不总是**被视为NULL,则会更精确.*

3> 小智..:

我怀疑如果你像早期的开发人员那样想到Oracle,这会更有意义 - 作为数据输入系统的美化后端.数据库中的每个字段对应于数据输入操作员在其屏幕上看到的表单中的字段.如果操作员没有在字段中输入任何内容,无论是"生日"还是"地址",那么该字段的数据都是"未知".对于操作员来说,没有办法表明某人的地址确实是一个空字符串,而且这无论如何都没有多大意义.


只有假设数据输入系统中的每个字段都是必需的,这才有意义.非必填字段的答案(例如"狗的名字")是有效的,因此空字符串仍然具有与NULL不同的目的.即使有了这样的假设,我也怀疑早期的开发人员认为Oracle是"数据输入系统的美化后端",所以我不确定这个答案是否有意义.

4> Walter Mitty..:

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

Oracle选择通过"不可能的价值"技术代表NULLS.例如,数字位置中的NULL将存储为"减零",这是一个不可能的值.计算产生的任何负零将在存储之前转换为正零.

Oracle也错误地选择将长度为零的VARCHAR字符串(空字符串)视为不可能的值,并且是表示NULL的合适选择.事实证明,空字符串远非一个不可能的值.它甚至是字符串连接操作下的身份!

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

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

(我在上面使用"位置"一词表示行和列的交集.)

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有