ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle中的NULL(五)

Oracle中的NULL(五)

原创 Linux操作系统 作者:yangtingkun 时间:2007-01-03 00:00:00 0 删除 编辑

最近在论坛上经常看到,很多人提出和NULL有关的问题。NULL其实是数据库中特有的类型,Oracle中很多容易出现的错误都是和NULL有关的。

打算简单的总结一下NULL的相关知识。

这一篇继续讨论空字符’’和NULL的关系。

Oracle中的NULL(一):http://yangtingkun.itpub.net/post/468/244434

Oracle中的NULL(二):http://yangtingkun.itpub.net/post/468/245107

Oracle中的NULL(三):http://yangtingkun.itpub.net/post/468/245259

Oracle中的NULL(四):http://yangtingkun.itpub.net/post/468/245697


上面一篇文章中,已经从事实的角度证明了空字符就是NULL的字符表现形式。这一篇将试图解释为什么空字符就是NULL。而且准备简单描述一下字符串合并操作||的特殊性。

根据NULL的定义,NULL是不确定、未知的含义,那么为什么字符类型的NULL是一个空字符呢?而且,对于NULL的加、减、乘、除等操作的结果都是NULL,而为什么字符串合并操作||,当输入字符串有一个为空时,不会得到结果NULL。

SQL> SELECT NULL || 'A', 'B' || NULL, NULL || NULL FROM DUAL;

NU ' N
-- - -
A B

上面两个问题需要从NULL的存储格式上解释。Oracle在存储数据时,先是存储这一列的长度,然后存储列数据本身。而对于NULL,只包含一个FF,没有数据部分。简单的说,Oracle用长度FF来表示NULL。

由于Oracle在处理的数据存储的时候尽量避免0的出现,因此,认为这里FF表示的是长度为0也是有一定道理的。或者从另一方面考虑,NULL只有一个长度,而没有数据部分。

而对于字符串来说,不管是长度为0的字符串还是没有任何数据的字符串,所代表的含义都是一个空字符串。从一点上讲,空字符串就是NULL也是有一定的道理的。

如果认为空字符串是字符形式的NULL,那么||操作的结果就不难理解了。

最后需要说明的是,不要将ORACLE里面的空字符串’’与C里面的空字符串””混淆。C里面的空字符串并非不不含任何数据,里面还包含了一个字符串结束符。C语言中的空字符串””对应Oracle中ASCII表中的0值,既CHR(0)。

CHR(0)是一个确定的值,它显然不是NULL。

SQL> SELECT * FROM DUAL WHERE CHR(0) = CHR(0);

D
-
X

SQL> SELECT * FROM DUAL WHERE CHR(0) IS NULL;

未选定行

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-69124/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10386723