Oracle没有区分空值和空字符串?

Ste*_* B. 14 database oracle

显然oracle似乎没有区分空字符串和空值.例如

Select name from TABLE_A where id=100;
  ID   NAME
  100  null

Update TABLE_A set NAME='' where id=100;
SELECT -->
  ID   NAME
  100  null

SELECT length(NAME) FROM TABLE_A WHERE id=100;
  null
Run Code Online (Sandbox Code Playgroud)

我想不出有什么理由可以建立Oracle以这种方式运行(它是否也在sqlplus中执行此操作? - 我通过java接口访问,引用的文章使用了php客户端).

难道你至少不想区分0长度和未定义长度吗?这是一个已知的问题?某些特定目的的故意行为?数据库理论中长期存在的争议?是什么赋予了?

(这是Matt Solnit对这个问题的回答.)

Qua*_*noi 33

Oracle 非常非常老.

回到80's它开发时(并且在有任何标准之前),他们认为这是一个好主意,然后给出Oracle存储其价值的方式,它确实是.

以下是Oracle存储数据的方式(取自文档):

替代文字

数据中不存储数据类型,只存储数据长度和数据本身.

如果在NULL具有值的两列之间发生,则将其存储为单个字节,这意味着列具有长度0(实际上0xFF).尾随NULLs根本不存储.

所以要存储值'test',Oracle需要存储5个字节:04 74 65 73 74.

但是,要存储空字符串和a NULL,Oracle只需要将数据长度设置为0.

如果您的数据要存储在每个都要20 Mb花费的硬盘上,那就非常聪明了5,000$.

后来,当标准出现时,它不再是一个好主意了,但到那个时候已经有很多很多代码依赖NULL并且''是同一个东西.

做出VARCHAR这样的区分将破坏大量的代码.

为了解决这个问题,他们改名VARCHARVARCHAR2(这不是任何标准的一部分),表示VARCHAR2永远不会一个区分NULL和一个空字符串,并呼吁大家使用这个数据类型来代替.

现在他们可能正在等待最后谁使用的人VARCHAROracle数据库中死去.

  • @Steve这是一个向后兼容的问题.此行为为新开发带来了一些问题,但将其更改为null!=空字符串会导致代码在升级到新的Oracle版本后突然无法正常运行时出现数千倍的问题. (3认同)
  • 成本!=质量.我从未使用过Oracle,但请查看Lotus Notes.该软件也花费了很多$$$,但很少有人会说这是一个高质量的应用程序. (2认同)
  • @FrankSchmitt:在Oracle中,你没有必要,但你应该这样做.仅仅`str IS NULL`在Oracle中就好了(截至目前),但在其他引擎中你应该添加`str IS NULL OR str =''`.他们的观点是你也坚持使用Oracle中的第二个. (2认同)