显然 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
我想不出为什么 Oracle 会被构建为以这种方式运行的任何充分理由(它在 sqlplus 中也这样做吗?-我正在通过 java 接口(interface)访问,引用的文章使用了 php 客户端)。
难道你不想至少区分 0 长度和未定义长度吗?这是一个已知的问题?出于某些特定目的的故意行为?数据库理论中的长期争论?是什么赋予了?
(这是由 Matt Solnit 对 this question 的回答提示的。)
最佳答案
Oracle
非常非常非常古老。
早在 80 年代
开发它时(在有任何标准之前),他们认为这是一个好主意,然后给定 Oracle
存储其值的方式,它真的是。
下面是 Oracle
存储数据的方式(取自 documentation ):
数据中没有存储数据类型,只有数据长度和数据本身。
如果 NULL
出现在两个具有值的列之间,它将存储为单个字节,表示列的长度为 0
(实际上,0xFF
) .尾随 NULL
根本不存储。
因此要存储值'test'
,Oracle
需要存储 5 个字节:04 74 65 73 74
。
但是,要同时存储空字符串和NULL
,Oracle
只需将数据长度设置为0
。
如果您的数据要存储在 20 Mb
硬盘上,每个硬盘的价格为 5,000 美元
,那就太聪明了。
后来标准出现了,就不是什么好主意了,但是那时候已经有很多很多代码依赖NULL
和''
是同一件事。
让 VARCHAR
来做这样的区分会破坏吨的代码。
为了修复它,他们将 VARCHAR
重命名为 VARCHAR2
(这不是任何标准的一部分),声明 VARCHAR2
将 从不区分NULL
和空字符串,并敦促大家改用这种数据类型。
现在他们可能正在等待最后一个在 Oracle
数据库中使用 VARCHAR
的人死去。
关于database - Oracle 不区分 null 和空字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1268177/