2010-06-10 77 views
6

允許在列上使用NULL值通常會允許表示缺少值。當使用NVARCHAR時,也可能有一個空字符串,而不將列設置爲NULL。在大多數情況下,我看不到空字符串的NVARCHAR與此列的NULL值之間的語義差異。(NOT)對於NVARCHAR列爲NULL

設置列NOT NULL不必處理代碼NULL值的可能性節省了我,那感覺更不具有的「沒有價值」(NULL或空字符串)不同的表示。

我會遇到任何其他問題,將我的NVARCHAR列設置爲NOT NULL。性能?存儲大小?任何我在客戶端代碼中使用值時忽略的東西?

+1

那麼,Oracle同意你的看法,並將空字符串視爲null。 – 2010-08-15 14:23:41

回答

3

A NULL表示該列中的值缺失/不適用。空白字符串不同,因爲這是一個實際值。 A NULL在技術上沒有數據類型,在這種情況下,作爲空字符串是nvarchar。

我不能看到任何問題與默認值,而不是NULL值。

事實上,它很可能是有益的,因爲你不會擔心照顧NULL值在您的任何疑問的

Select Sum(TotalPrice) as 'TotalPrice' From myTable Where CountOfItems > 10 

更容易比

Select Sum(IsNull(TotalPrice,0)) as 'TotalPrice' From myTable Where IsNull(CountOfItems,0) > 10 

您應該在您的DDL中使用默認約束,以確保沒有流氓NULL出現在您的數據中。

+3

-1如果'TotalPrice'爲'NULL',那麼它將不會被包含在聚合中。如果'CountOfItems'爲'NULL',那麼它就不會匹配謂詞'> 10',所以這兩個都是多餘的,而第二個只是使得表達式不可變。另外如果你使用'AVG'而不是'SUM'?現在你的虛擬值會使結果不正確。 – 2011-11-16 12:29:41

3

NULL值的概念是混淆的常見來源。 NULL是而不是與空字符串相同,或者值爲零。

從概念上講,NULL意味着「一個未知的缺失值」,它的處理方式與其他值有所不同。例如,要測試NULL,不能使用算術比較運算符,如=,<或<>。

如果您有可能包含「缺少未知值」的列,則必須將它們設置爲接受NULL。另一方面,空字符串僅表示值已知爲,但爲空。

例如:如果「用戶」表中的「中間名」字段設置爲NULL,則應該表示該用戶的中間名不明。用戶可能有或沒有中間名。但是,如果「中間名」字段設置爲空字符串,則這應該表示用戶已知沒有中間名。

+0

是和否,取決於應用程序。有很多用例可以找到某些空字符串和空字符串不需要單獨的含義。 – Chalky 2015-07-21 00:40:19

0

如果有什麼我會說,如果您不允許NULL,那麼使用表格會更容易,因爲您不必在代碼中檢查NULL,所以我只設置一列如果我需要處理未知值而不是空值,則允許NULL。

0

ho1說什麼。但是你不建議定義一個NOT NULL列,然後爲'Unknown'定義一個特殊的值。