database - Oracle 不区分 null 和空字符串?

标签 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

我想不出为什么 Oracle 会被构建为以这种方式运行的任何充分理由(它在 sqlplus 中也这样做吗?-我正在通过 java 接口(interface)访问,引用的文章使用了 php 客户端)。

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

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

最佳答案

Oracle 非常非常非常古老。

早在 80 年代 开发它时(在有任何标准之前),他们认为这是一个好主意,然后给定 Oracle 存储其值的方式,它真的是。

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

alt text

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

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

因此要存储值'test'Oracle 需要存储 5 个字节:04 74 65 73 74

但是,要同时存储空字符串和NULLOracle 只需将数据长度设置为0

如果您的数据要存储在 20 Mb 硬盘上,每个硬盘的价格为 5,000 美元,那就太聪明了。

后来标准出现了,就不是什么好主意了,但是那时候已经有很多很多代码依赖NULL'' 是同一件事。

VARCHAR 来做这样的区分会破坏的代码。

为了修复它,他们将 VARCHAR 重命名为 VARCHAR2(这不是任何标准的一部分),声明 VARCHAR2从不区分NULL 和空字符串,并敦促大家改用这种数据类型。

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

关于database - Oracle 不区分 null 和空字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1268177/

相关文章:

sql - 选择包含每个数字但不仅仅是一个的某些值

mysql - 数据库设计不支持产品录入。

c# - 在数据库中存储调查的多项选择答案

php - 在 codeigniter 上只返回一条记录

database - Docker/Oracle数据库/卷持久化/创建表空间

sql - Oracle GROUP BY 类似的时间戳?

database - ArangoDB升级丢失数据

java - Jboss:用数据初始化数据库

java - 如何将 JDBC 模板结果导出到 Excel 工作表

SQL查找只有2列值的整行