数据库 – Oracle不区分null和空字符串?

前端之家收集整理的这篇文章主要介绍了数据库 – Oracle不区分null和空字符串?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
显然oracle似乎不区分空字符串和null.例如.
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

我不能想到有什么好的理由为什么Oracle会以这种方式进行构建(在sqlplus中也是如此)?我通过java接口访问,引用的文章使用了一个PHP客户端).

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

(这是Matt Solnit对this question的回答提示)

解决方法

Oracle非常非常老.

早在80年代,当它被开发(并且在有任何标准之前)他们认为是一个好主意,然后给Oracle Oracle存储它的价值观,这真的是.

Oracle存储数据的方式如下(取自documentation):

没有数据类型存储在数据中,只有数据长度和数据本身.

如果两列之间出现NULL,则将其存储为一个单字节,表示列的长度为0(实际上为0xFF).尾随的空值根本不存储.

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

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

如果您的数据要存储在每个成本为5,000美元的20 Mb硬盘驱动器上,则非常聪明.

后来,当标准出现的时候,这不是一个好主意,但那时候已经有很多很多代码依赖于NULL,并且“是一回事.

使VARCHAR做这样的区别会打破大量的代码.

要修复它,他们将VARCHAR重命名为VARCHAR2(这不是任何标准的一部分),表示VARCHAR2将永远不会区分NULL和空字符串,并敦促所有人使用此数据类型.

现在他们可能在等待Oracle数据库中使用VARCHAR的最后一个人死亡.

猜你在找的MsSQL相关文章