加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:15:07 所属栏目:MsSql教程 来源:网络整理
导读:显然oracle似乎不区分空字符串和null.例如. Select name from TABLE_A where id=100; ID NAME 100 nullUpdate TABLE_A set NAME='' where id=100;SELECT -- ID NAME 100 nullSELECT length(NAME) FROM TABLE_A WHERE id=100; 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的最后一个人死亡.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读