簡體   English   中英

NULL如何存儲在數據庫中?

[英]How are NULLs stored in a database?

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

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


第一次嘗試:

假設服務器將未定義的值(可能是任何值)放入字段中以獲取NULL值。

你能非常幸運並用它來檢索NULL值嗎?

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

第二次嘗試:

服務器是否有某個標志或任何元數據表明此字段為NULL?

然后,服務器必須讀取此元數據以驗證該字段。

如果元數據指示NULL值,並且查詢沒有“field IS NULL”,則忽略該記錄。


看起來太容易了......

MySql使用第二種方法。 它存儲一個位數組(每列一個),每行包含數據,以指示哪些列為空,然后將該字段的數據留空。 我很確定這對所有其他數據庫也是如此。

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

在PostgreSQL上,它使用一個可選的位圖,每列一位(0為空,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而異。

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

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

;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM