2009-08-12 81 views
202

我在網站上有一個窗體,有很多不同的領域。一些字段是可選的,而一些是強制性的。在我的數據庫中,我有一個包含所有這些值的表,在用戶沒有放入任何數據的數據庫列中插入NULL值或空字符串是否更好?MySQL,最好插入NULL或空字符串?

回答

203

通過使用NULL,您可以區分「放入數據」和「放入空數據」。

一些更差異:

  • NULLLENGTHNULL,空字符串的LENGTH0

  • NULL s在空串之前被排序。

  • COUNT(message)將計空字符串,但不NULL小號

  • 您可以搜索使用綁定變量一個空字符串而不是爲NULL。這個查詢:

    SELECT * 
    FROM mytable 
    WHERE mytext = ? 
    

    不會匹配NULLmytext,你從客戶端傳遞的任何值。爲了匹配NULL S,你將不得不使用其他查詢:

    SELECT * 
    FROM mytable 
    WHERE mytext IS NULL 
    
+1

但你認爲哪一個更快? 0或NULL或「」 – 2010-10-16 23:48:30

+3

@aadravid:沒有區別。 – Quassnoi 2010-10-17 10:20:55

+7

in InnoDB NULL的佔用空間較小 – 2013-07-25 10:41:45

3

我不知道什麼最好的做法是在這裏,但除非你想空我一般會傾向於空的犯錯表示與空字符串不同的東西,並且用戶的輸入與您的空字符串定義相匹配。

請注意,我在說你需要定義你希望他們有什麼不同。有時讓它們有所不同有時是有道理的,有時它不是。如果不是,只需選擇一個並堅持下去。就像我說的,我傾向於在大多數時候傾向於NULL。

哦,並且記住,如果該列爲空,則該記錄不太可能出現在幾乎任何基於該列的選擇(具有where子句,以SQL術語來說)的查詢中,除非該選擇是當然是一個空列。

+0

......現在我看到了上面的答案,我認爲可以肯定地說,你關心的通常的區別是沒有數據和空數據。 :-) – 2009-08-12 18:54:13

38

有一件事要考慮,如果你有有史以來計劃切換數據庫,是Oracle does not support empty strings。它們被自動轉換爲NULL,並且不能使用像WHERE somefield = ''這樣的子句來查詢它們。

+11

這聽起來令人難以置信的腥,即使在你的鏈接,所以我試了一下。空字段設置爲'',oracle忽略它。報告長度爲空而不是0.這是錯誤的。這需要解決一些問題。想想我會發布這是另一個問題。 – 2009-08-12 19:10:44

+1

'史蒂夫B.':看到這個問題:http://stackoverflow.com/questions/1171196/difference-between-varchar-and-varchar2 – Quassnoi 2009-08-12 19:16:37

+0

感謝您的參考,但我仍然不明白的推理。 發表爲http://stackoverflow.com/questions/1268177/oracle-not-distinguishing-between-nulls-and-empty-strings – 2009-08-12 19:24:03

7

有一點要記住,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 

這可以使事情變得更加複雜。

+22

在我看來濫用你的數據庫來「修復」你的代碼或框架中的錯誤是一個(非常)不好的編碼習慣。當沒有數據時,你應該插入NULL並且在使用時保持一致。否則,您必須使用如下語句:if(myString == null || myString =「」)。當你的代碼中沒有設置或定義一個對象時,你也使用了NULL而不是某種「佔位符」(在我看來這是一個空字符串)。 – Gertjan 2009-08-12 19:39:16

+5

非常依賴您選擇的語言。在Python中「如果不是myString:」測試None和「」。可能主要是文化問題。爪哇人的「壞習慣」是充滿活力的人的優雅。 – max 2010-10-21 08:54:30

5

更好地插入NULL在MySQL中的數據庫中的一致性。外鍵可以存儲爲NULL,但不能爲空字符串。

在約束中,您將遇到空字符串的問題。 您可能必須插入帶有唯一空字符串的假記錄以滿足外鍵約束。糟糕的做法,我猜。

參見:Can a foreign key be NULL and/or duplicate?

-1

我不知道性能做。但就數據質量而言,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格式,則可以減輕此問題。

但是,是的,letting null exist is a billion dollar mistake