2008-10-31 21 views
8

我很想知道如何將NULL存儲到數據庫中?如何將NULL存儲在數據庫中?

它肯定取決於數據庫服務器,但我想對此有一個大概的想法。


首先嚐試:

假設服務器放在一個未定義的值(可以是任何東西),進入該領域的NULL值。

難道你是非常幸運和檢索

...WHERE field = 'the undefined value (remember, could be anything...)' 

第二個嘗試NULL值:

服務器是否有標誌或任何元數據的地方,表示此字段爲空?

然後服務器必須讀取這個元數據來驗證字段。

如果元數據顯示NULL值,如果查詢沒有「字段爲空」, 那麼該記錄將被忽略。


這似乎太容易了......

+1

服務器不具備某種形式的標誌,並且服務器讀取元數據來驗證特殊NULL指標場。正因爲值爲NULL,這並不意味着該記錄將被忽略 - 很多,很多(通常很複雜)的原因。 – 2008-11-01 15:50:26

回答

2

服務器通常使用元數據信息,而不是魔法值。所以有些地方會指定字段是否爲空。

- 亞當

9

MySQL使用第二種方法。它將每行的數據(每列一個)與數據存儲在一起,以指示哪些列爲空,然後將該字段的數據留空。我很確定所有其他數據庫都是如此。

第一種方法的問題是,您確定無論您爲數據選擇什麼值都不會顯示爲有效數據嗎?對於某些值(如日期或浮點數),這是正確的。對於其他人(如整數),這是錯誤的。

1

IBM的Informix Dynamic Server使用特殊的值來表示空值。例如,SMALLINT(16位,帶符號)的有效值範圍是-32767 .. + 32767。另一個值-32768被保留以指示NULL。對於INTEGER(4字節,帶符號)和BIGINT(8字節,帶符號)也是如此。對於其他類型,它使用其他特殊表示(例如,SQL FLOAT和SMALLFLOAT的所有第1位 - 分別稱爲C double和float)。這意味着它不必使用額外的空間。

IBM DB2 for Linux,Unix,Windows使用額外的字節來存儲空指示器; AFAIK,它爲每個可空字段使用一個單獨的字節,但我可能在這個細節上是錯誤的。

因此,正如所指出的,機制因DBMS而異。

1

指定NULL的特殊值的問題是遲早會插入特殊值。例如,它會被插入到表中,指定了不同的數據庫服務器

| DBServer  | SpecialValue | 
+--------------+--------------+ 
| 'Oracle'  | 'Glyph'  | 
| 'SQL Server' | 'Redmond' | 

;-)