显然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这样的区分将破坏大量的代码.
为了解决这个问题,他们改名VARCHAR到VARCHAR2(这不是任何标准的一部分),表示VARCHAR2将永远不会一个区分NULL和一个空字符串,并呼吁大家使用这个数据类型来代替.
现在他们可能正在等待最后谁使用的人VARCHAR的Oracle数据库中死去.