数据库 – Oracle不区分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的最后一个人死亡. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |