2010-06-05 45 views
5

我知道NULL不是零......也不是空字符串。但是,系統保存的NULL的值是什麼?要識別它?SQL Server中NULL值是什麼?

+3

爲什麼你需要知道什麼?有幾種方法可以實現,您可以通過查看其中一種開源數據庫引擎的源代碼來獲得一些見解。 – crazyscot 2010-06-05 16:21:35

+0

最後兩個採訪這個問題被問我....和我的回覆是「空白臉」:( – Relativity 2010-06-05 16:24:02

回答

10

我相信,對於允許空值的每一列,行都有一個空位圖。如果指定列中的行爲空,則位圖中的位爲1,否則爲0.

+0

非常感謝.... – Relativity 2010-06-05 16:47:21

+0

這是正確的答案,可空性位圖發生每一行都存儲,並且只有當一行中沒有列可以爲空時才存在 - 只要一行中的一列可以爲空,那麼它就存儲一個跟蹤所有列的位圖。 – Andrew 2010-06-06 09:24:11

20

NULL是SQL語言的一個特殊元素,它不等於或不等於任何數據類型中的任何值。

如上所述,NULL不爲零,一個空字符串或false。即false = NULL返回UNKNOWN

有些人說NULL不是一個值,它是一個狀態。沒有價值的狀態有點像Zen Koan。 :-)

我不知道MS SQL Server如何在內部存儲它,但是沒關係,只要他們按照SQL標準實現它。

+0

非常感謝.... – Relativity 2010-06-05 16:48:17

7

我懷疑訪問者是否想讓你知道SQL服務器如何存儲null s,這個問題的關鍵是讓你想想你會如何存儲特殊的價值。您不能使用標記值(或幻數),因爲這會使其中具有該值的任何行突然變爲null

有很多方法可以做到這一點。想到的最簡單的2是存儲一個標誌,每個可爲空的值基本上是一個isNull標誌(這也基本上是如何在.NET中工作的)。第二種方法是每行存儲一個空標記的位圖,每列一個。

當面對這樣的面試問題時,絕對最差的迴應是坐下來茫然地盯着。大聲想一些,承認你不知道SQL Server如何去做,然後提出一些合理的做法。你還應該準備好談論一下爲什麼你會選擇一種方法而不是另一種方法,以及每種方法的優缺點。

+0

非常感謝.... – Relativity 2010-06-05 16:47:51

0

概念上,NULL表示「缺少一個未知值」,它的處理方式與其他值有所不同。

在MySQL中,0或NULL表示錯誤,其他都表示爲真。布爾操作的默認真值爲1.

兩個NULL值在GROUP BY中被視爲相等。

執行ORDER BY時,如果您執行ORDER BY ... ASC,則首先顯示NULL值,如果執行ORDER BY ... DESC,則顯示NULL值。

10

SQL Server行格式在MSDN中描述,並在各種博客上進行了分析,例如Paul Randal的Anatomy of a Record。的重要的信息是記錄結構:

  • 記錄標題
    • 4個字節長的記錄的元數據(記錄類型)
    • 在記錄到指向前方
    • 兩個字節的
    • 兩個字節NULL位圖
  • 記錄的固定長度部分,包含存儲數據類型的列h大約固定長度(例如, BIGINT,CHAR(10),日期時間)
  • NULL位圖在記錄
    • 兩個字節的列的計數
    • 無論字節來存儲每列一個位在記錄,的可變數目的是否列可以爲空或不
    • 讀取都爲NULL的列時,這允許優化
  • 可變長度列偏移陣列 個
    • 兩個字節的可變長度列的計數
    • 每個可變長度列兩個字節,給出了偏移到列值
  • 的端版本標籤
    • 一個14-包含在tempdb
時間戳加上一個指針到版本存儲字節結構

因此NULL字段在NULL位圖中設置了一些位。

3

正如比爾所說,這是一個沒有價值的狀態。

在表中的一行SQL Server中它存儲在空位圖中:實際上沒有存儲值。的SQL Server

一個怪癖:

SELECT TOP 1 NULL AS foo INTO dbo.bar FROM sys.columns 

什麼數據類型是富?這當然沒有意義,但它讓我一度陷入困境。

0

NULL值實際上意味着缺失值,有些人還會用術語不明

NULL值也不是無所不能的,甚至不是另一個NULL

看看這些例子

將打印等於

IF 1 = 1 
PRINT 'is equaL' 
ELSE 
PRINT 'NOT equal' 

將打印等於(隱式轉換髮生)

IF 1 = '1' 
PRINT 'is equaL' 
ELSE 
PRINT 'NOT equal' 

將打印不等於

IF NULL = NULL 
PRINT 'is equaL' 
ELSE 
PRINT 'NOT equal'