我在網站上有一個窗體,有很多不同的領域。一些字段是可選的,而一些是強制性的。在我的數據庫中,我有一個包含所有這些值的表,在用戶沒有放入任何數據的數據庫列中插入NULL值或空字符串是否更好?MySQL,最好插入NULL或空字符串?
回答
通過使用NULL
,您可以區分「放入數據」和「放入空數據」。
一些更差異:
的
NULL
甲LENGTH
是NULL
,空字符串的LENGTH
是0
。NULL
s在空串之前被排序。COUNT(message)
將計空字符串,但不NULL
小號您可以搜索使用綁定變量一個空字符串而不是爲
NULL
。這個查詢:SELECT * FROM mytable WHERE mytext = ?
不會匹配
NULL
在mytext
,你從客戶端傳遞的任何值。爲了匹配NULL
S,你將不得不使用其他查詢:SELECT * FROM mytable WHERE mytext IS NULL
我不知道什麼最好的做法是在這裏,但除非你想空我一般會傾向於空的犯錯表示與空字符串不同的東西,並且用戶的輸入與您的空字符串定義相匹配。
請注意,我在說你需要定義你希望他們有什麼不同。有時讓它們有所不同有時是有道理的,有時它不是。如果不是,只需選擇一個並堅持下去。就像我說的,我傾向於在大多數時候傾向於NULL。
哦,並且記住,如果該列爲空,則該記錄不太可能出現在幾乎任何基於該列的選擇(具有where子句,以SQL術語來說)的查詢中,除非該選擇是當然是一個空列。
......現在我看到了上面的答案,我認爲可以肯定地說,你關心的通常的區別是沒有數據和空數據。 :-) – 2009-08-12 18:54:13
有一件事要考慮,如果你有有史以來計劃切換數據庫,是Oracle does not support empty strings。它們被自動轉換爲NULL,並且不能使用像WHERE somefield = ''
這樣的子句來查詢它們。
這聽起來令人難以置信的腥,即使在你的鏈接,所以我試了一下。空字段設置爲'',oracle忽略它。報告長度爲空而不是0.這是錯誤的。這需要解決一些問題。想想我會發布這是另一個問題。 – 2009-08-12 19:10:44
'史蒂夫B.':看到這個問題:http://stackoverflow.com/questions/1171196/difference-between-varchar-and-varchar2 – Quassnoi 2009-08-12 19:16:37
感謝您的參考,但我仍然不明白的推理。 發表爲http://stackoverflow.com/questions/1268177/oracle-not-distinguishing-between-nulls-and-empty-strings – 2009-08-12 19:24:03
有一點要記住,NULL可能會讓你的代碼路徑變得更加困難。例如在Python中,大多數數據庫適配器/ ORM將NULL
映射到None
。
所以像: 「你好,無喬·多伊」
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
可能導致爲了避免它,你需要像這樣的代碼:
if databaserow.title:
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
else:
print "Hello, %(firstname) %(lastname)!" % databaserow
這可以使事情變得更加複雜。
在我看來濫用你的數據庫來「修復」你的代碼或框架中的錯誤是一個(非常)不好的編碼習慣。當沒有數據時,你應該插入NULL並且在使用時保持一致。否則,您必須使用如下語句:if(myString == null || myString =「」)。當你的代碼中沒有設置或定義一個對象時,你也使用了NULL而不是某種「佔位符」(在我看來這是一個空字符串)。 – Gertjan 2009-08-12 19:39:16
非常依賴您選擇的語言。在Python中「如果不是myString:」測試None和「」。可能主要是文化問題。爪哇人的「壞習慣」是充滿活力的人的優雅。 – max 2010-10-21 08:54:30
更好地插入NULL
在MySQL中的數據庫中的一致性。外鍵可以存儲爲NULL
,但不能爲空字符串。
在約束中,您將遇到空字符串的問題。 您可能必須插入帶有唯一空字符串的假記錄以滿足外鍵約束。糟糕的做法,我猜。
我不知道性能做。但就數據質量而言,null是不好的。
Null爲您提供類型maybe
,這會迫使您編寫運行時類型檢查,例如: something = a.b.c.d.something if exist?(a) && exist?(a.b) && exist?(a.b.c) && exist?(a.b.c.d) && exist?(a.b.c.d.something)
。
如果您不使用json/hash/array格式,則可以減輕此問題。
- 1. PyMySQL插入NULL或字符串
- 2. MySQL格式化字符串或返回空字符串NULL
- 3. MySQL和PHP - 插入NULL而不是空字符串
- 4. 在mysql中插入查詢字符串中的NULL或'string'
- 5. Mysql - 插入帶空格的字符串
- 6. 空字符串+ null =「null」?
- 7. 返回null或空字符串
- 8. 性能:在PHP空字符串或NULL
- 9. 在PHP中爲MySQL插入生成空字符串NULL的函數
- 10. MySQL:獲取空字符串或空字符串
- 11. Django將字符串「(NULL)」插入到MySQL字段中,而不是NULL
- 12. 將`NULL`轉換爲字符串(空或者字面上`NULL`)
- 13. 如何在PHP PDO中插入空字符串而不是null
- 14. Golang將NULL插入到SQL中而不是空字符串
- 15. 在觸發條件中插入空值和字符串'Null
- 16. Kohana的ORM插入NULL而不是空字符串
- 17. 如何向datetime var中插入空或空字符串?
- 18. Xpages空字符串或空字符串
- 19. c#空字符串 - > null?
- 20. 空字符串對NULL
- 21. 插入Python字符串或字典到MySQL
- 22. Mysql唯一值或空字符串
- 23. 當變量爲空時,Mysql插入null
- 24. 將空字符串設置爲null插入數據庫時爲空
- 25. ORDER BY字符串(可以是數字或字符串)將空字符串放到最後MySQL
- 26. 在字符串中插入空格
- 27. 插入填充空白到字符串
- 28. 防止插入空字符串
- 29. mysql只插入部分字符串值
- 30. 將Java字符串插入MySQL
但你認爲哪一個更快? 0或NULL或「」 – 2010-10-16 23:48:30
@aadravid:沒有區別。 – Quassnoi 2010-10-17 10:20:55
in InnoDB NULL的佔用空間較小 – 2013-07-25 10:41:45