显然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的最后一个人死亡.