Oracle中的NULL(五)

yangtingkun發表於2007-01-03

最近在論壇上經常看到,很多人提出和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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章