如何NULL
和空varchar值存儲在SQL Server。如果我在我的UI上沒有用戶輸入string
字段,我應該存儲NULL
還是''
?SQL Server:空VS空字符串
回答
有一篇很好的文章here討論了這一點。關鍵的事情是,表大小沒有差別,但是有些用戶更喜歡使用空字符串,因爲它可以使查詢更容易,因爲沒有NULL檢查。你只需檢查字符串是否爲空。另外需要注意的是NULL在關係數據庫中的含義。這意味着指向字符字段的指針在行標題中設置爲0x00,因此沒有要訪問的數據。
更新 有一個詳細的文章here其中談到什麼是真正發生根據行
每一行都有允許空值的列的空位上。如果 列中的行爲空,則位圖中的位爲1,否則爲0.
對於可變大小的數據類型,實際大小爲0字節。
對於固定大小的數據類型,acctual大小是默認數據類型大小 以字節爲單位設置爲默認值(0表示數字,'表示字符)。
DBCC PAGE的結果顯示NULL和空字符串均佔用零字節。
這不是關於這一點的討論。這實際上只是表達他們意見而沒有任何支持的人。他們提出的唯一觀點是空間要求是相同的,這不支持任何一種方法。 – MikeKulls 2012-07-04 07:13:03
已更新,提供有關行/列基礎上發生的更多詳細信息。 – openshac 2012-07-04 11:07:49
「另一點需要注意的是NULL在關係數據庫的上下文中意味着什麼,這意味着指向字符字段的指針在行標題中設置爲0x00,因此沒有要訪問的數據。」 NULL並不意味着在關係數據庫的上下文中。它只意味着在一個特定的供應商的關係數據庫的實現。 – Thanatos 2012-10-30 22:39:32
NULL
是一個非值,就像undefined。 ''
是一個包含0個字符的空字符串。
數據庫中字符串的值取決於您在UI中的值,但通常情況下,如果在查詢或存儲過程中指定參數,則該字符串爲空字符串''
。
空字符串是一個零長度或無字符的字符串。 Null
缺少數據。
空值分別存儲在所有列的特殊位圖空間中。
如果您在應用程序中沒有區分NULL
和''
,那麼我建議您在表中存儲''
(除非字符串列是外鍵,在這種情況下,最好禁止列從存儲空字符串,並允許NULL,如果這是與您的應用程序的邏輯兼容)。
SQL Server中如何存儲「NULL」和「空varchar」值。 你爲什麼想知道這個?換句話說,如果你知道答案,你將如何使用這些信息?
如果我沒有用戶輸入字符串字段在我的用戶界面上,我應該存儲一個NULL或''? 這取決於你的領域的性質。問問你自己空字符串是否是你的字段的有效值。
如果是(例如,地址中的房屋名稱),那麼這可能是您想要存儲的內容(取決於您是否知道該地址沒有房屋名稱)。
如果不是(例如,一個人的名字),那麼你應該存儲空,因爲人們沒有空白的名字(在任何文化中,所以據我所知)。
我知道這並不重要。但是,我想知道它。 – 2011-04-11 08:32:48
小心空值和檢查在SQL Server中的不平等。其中BLA是空
例如
select * from foo where bla <> 'something'
將不會返回的記錄。儘管邏輯上它應該。
所以要檢查的正確方法是
select * from foo where isnull(bla,'') <> 'something'
這當然人們常常忘了,然後得到莫名其妙的錯誤。
很難接受,「null = null」返回false,但是「null <>'something'」也返回false只是感覺很殘忍。 – MikeTeeVee 2011-10-07 19:58:32
@MikeTeeVee:無論如何,這不是'FALSE'。它是'UNKNOWN',並且沒有通過條件(只有'TRUE'結果通過)。 – 2012-04-11 19:16:27
上面的查詢可以優化一點,它會快一點。你可以做'select * from foo where(bla <>'something')或者(bla是null)' – Nicolas 2015-11-20 10:51:04
,如果它不是一個外鍵字段,不使用空字符串可以爲您節省一些麻煩。只允許空值,如果你將空值表示與空字符串不同的東西。例如,如果您有密碼字段,則空值可能表示新用戶尚未創建其密碼,而空的varchar可能表示空密碼。對於像「地址2」這樣的字段而言,允許空值只會讓生活變得困難。事情需要提防包括空引用和=意想不到的結果和Vagif威爾第提到<>運營商,並密切關注着這些東西往往是不必要的程序員開銷。
編輯:如果性能是一個問題,看到此相關的問題:Nullable vs. non-null varchar data types - which is faster for queries?
NULL和「空字符串」之間的概念差別是真實的,在數據庫設計中非常重要,但常被誤解和應用不當 - 這裏有一個這兩個簡短的描述:
NULL - 意味着我們不知道什麼是價值,它可能存在,但它可能不存在,我們只是不知道。
空字符串 - 意味着我們知道什麼是價值,什麼都不是。
這裏有一個簡單的例子: 假設你有一個人的名字的表格,包括單獨列FIRST_NAME,middle_name和LAST_NAME。 first_name ='John',姓氏 ='Doe'和middle_name IS NULL,表示我們不知道中間名是什麼,或者它是否存在。改變這種情況,使得middle_name =「」(即空字符串),並且它現在是指我們知道,沒有中間的名字。
我曾經聽到一個SQL Server教練推動使得在所需的數據庫中的每個字符類型列,然後指定一個默認值各自是「的」(空字符串)或「未知」。在說明這一點時,教師表明他對NULL和空字符串之間的區別沒有清楚的理解。無可否認,這些差異似乎令人困惑,但對我來說,上述例子有助於澄清差異。此外,瞭解編寫SQL代碼時的差異以及正確處理NULL和空字符串非常重要。
我可以做'select * from foo where isnull(bla,'')<>'something''喜歡指出這不是普遍客觀的意見。 – industryworker3595112 2017-08-01 12:15:10
您在這裏爭辯說NULL表示「未知」,不應該表示「沒有」/「不適用」。但其他數據類型呢?如果我們有表格CONTRACTS,列DATE類型爲「maturity_date」。如果我們擁有沒有到期日的合同(例如,直到要求存款),該怎麼辦?在這種情況下,完全可以接受的方法是離開「maturity_date = NULL」。 (即對於其他數據類型,NULL適用於「無」/「不適用」的情況)(我的觀點:null與空字符串vs特殊值只是協議約定的問題) – industryworker3595112 2017-08-01 12:28:06
是的,我必須同意這更多的是這兩者的單一實現。這是合理的,但其他實現也是如此。 – 2017-09-07 04:40:14
- 1. 字符串的valueOf VS空字符串
- 2. Concatination VS空字符串
- 3. 空VS在甲骨文空字符串
- 4. SQL Server過濾掉字符串,但留下空字符串
- 5. 空白字段VS NULL - SQL Server 2008中
- 6. SQL Server是否將空值作爲空字符串?
- 7. SQL字符串空終止?
- 8. 空間SQL字符串VBA
- 9. SQL:刪除空字符串
- 10. SQL測試空字符串
- 11. 空字符串在SQL
- 12. sql server認爲空字符串等於某些字符
- 13. SQL Server在nvarchar字符串中選擇unicode空字符
- 14. Xpages空字符串或空字符串
- 15. rails text_field/text_ara空字符串vs零
- 16. 空字符串VS在Java中
- 17. 空字符串
- 18. 空字符串
- 19. JSON空字符串爲空
- 20. 處理空/空字符串
- 21. 字符串爲空或空
- 22. 爲字段返回空字符串SQL
- 23. 列在SQL Server空值VS甲骨文
- 24. 空單元格vs導入文件中的空字符串
- 25. 隱藏輸入「空字符串」vs「空」Javascript,VB
- 26. 如何檢查是否爲空並且不是空SQL Server中的字符串?
- 27. 如何限制SQL Server接受空字符串
- 28. 實體框架和SQL Server在字符串中添加空格?
- 29. 如何在SQL Server中空白之前獲取字符串? ''
- 30. SQL Server查詢用於檢查空字符串並用其它
相關:[SQL:空字符串vs NULL值](http://programmers.stackexchange.com/q/32578/85530) – 2014-01-24 02:33:34