2009-08-12 12 views
202

Ich habe ein Formular auf einer Website, die viele verschiedene Felder hat. Einige der Felder sind optional, während andere obligatorisch sind. In meiner DB habe ich eine Tabelle, die alle diese Werte enthält. Ist es besser, einen NULL-Wert oder eine leere Zeichenfolge in die DB-Spalten einzufügen, in die der Benutzer keine Daten eingegeben hat?MySQL, besser NULL oder leere Zeichenfolge einfügen?

Antwort

203

Mit NULL können Sie unterscheiden zwischen "put no data" und "put leave data".

Einige weitere Unterschiede:

  • A LENGTH von NULL ist NULL, ein LENGTH eines leeren String ist 0.

  • NULL s werden vor den leeren Strings sortiert.

  • COUNT(message) werden leere Strings zählen aber nicht NULL s

  • Sie für eine leere Zeichenkette suchen können eine gebundene Variable aber nicht für einen NULL. Diese Abfrage:

    SELECT * 
    FROM mytable 
    WHERE mytext = ? 
    

    wird nie ein NULL in mytext, entspricht, den Wert, den Sie von dem Client übergeben. Um NULL s zu entsprechen, müssen Sie andere Abfrage verwenden:

    SELECT * 
    FROM mytable 
    WHERE mytext IS NULL 
    
+1

aber was denkst du ist schneller? 0 oder NULL oder "" –

+3

@aadravid: kein Unterschied. – Quassnoi

+7

in InnoDB NULL nehmen weniger Platz –

3

Ich weiß nicht, was am besten Praxis wäre hier, aber ich würde irren generell für die Null, wenn Sie null wollen etwas anderes als leerer String bedeuten, und die Eingabe des Benutzers stimmt mit der Definition für leere Zeichenfolgen überein.

Beachten Sie, dass ich sage, dass Sie definieren müssen, wie Sie möchten, dass sie anders sind. Manchmal macht es Sinn, sie anders zu haben, manchmal nicht. Wenn nicht, wählen Sie einen aus und bleiben Sie dabei. Wie gesagt, ich bevorzuge die NULL die meiste Zeit.

Oh, und bedenken Sie, dass, wenn die Spalte null ist, der Datensatz in praktisch keiner Abfrage erscheint, die aus dieser Spalte (hat eine Where-Klausel, in SQL-Begriffen) basiert, sofern die Auswahl ist für eine Null-Spalte natürlich.

+0

... Und jetzt, wo ich die Antwort über mir sehe, denke ich, dass es sicher ist, dass die übliche Unterscheidung, die Sie interessieren würden, keine Daten gegen leere Daten ist. :-) –

38

Eine Sache zu prüfen, wenn Sie jemals Plan auf den Wechsel von Datenbanken planen, ist das Oracle does not support empty strings. Sie werden automatisch in NULL konvertiert, und Sie können sie nicht mit Klauseln wie WHERE somefield = '' abfragen.

+11

Das klang unglaublich fischig für mich, sogar auf deinem Link, also habe ich es versucht. Nullfeld, gesetzt auf '', Orakel ignoriert es. Gibt die Länge als null statt als 0 an. Das ist einfach falsch. Es muss einen Weg geben. Denke, ich poste das als eine andere Frage. –

+1

'Steve B.': siehe diese Frage: http://stackoverflow.com/questions/1171196/difference-between-varchar-and-varchar2 – Quassnoi

+0

Danke für die Referenz, obwohl ich die Argumentation immer noch nicht verstehe. Gepostet als http://stackoverflow.com/questions/1268177/oracle-not-differencing-between-nulls-and-empty-strings –

7

Eine Sache zu beachten ist, dass NULL Ihre Codepaths viel schwieriger machen kann. In Python beispielsweise mappen die meisten Datenbankadapter/ORMs NULL zu None.

So Dinge wie: "Hallo, kein Joe Doe"

print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow 

könnte zur Folge Um dies zu vermeiden müssen Sie so etwas wie dieser Code:

if databaserow.title: 
    print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow 
else: 
    print "Hello, %(firstname) %(lastname)!" % databaserow 

Welche Dinge viel komplizierter machen.

+22

Meiner Meinung nach ist der Missbrauch Ihrer Datenbank, um Fehler in Ihrem Code oder dem Framework zu "reparieren", eine (sehr) schlechte Programmierpraxis. Wenn keine Daten vorhanden sind, sollten Sie einfach NULL einfügen und konsistent sein. Andernfalls müssen Sie folgende Anweisungen verwenden: if (myString == null || myString = ""). Wenn ein Objekt nicht in Ihrem Code festgelegt oder definiert ist, verwenden Sie auch NULL statt irgendeiner Art von "Platzhalter" (was meiner Meinung nach eine leere Zeichenfolge ist). – Gertjan

+5

Hängt sehr von Ihrer Sprache der Wahl ab. In Python testet "if not myString:" auf None und "". Wahrscheinlich hauptsächlich ein kulturelles Thema. Die "schlechte Praxis" der Java-Kerle ist die Eleganz der dynamischen Person. – max

5

Besser zum Einfügen NULL für Konsistenz in Ihrer Datenbank in MySQL. Fremdschlüssel können als NULL aber NICHT als leere Zeichenfolgen gespeichert werden.

Sie werden Probleme mit einer leeren Zeichenfolge in den Einschränkungen haben. Sie müssen möglicherweise einen falschen Datensatz mit einer eindeutigen leeren Zeichenfolge einfügen, um eine Fremdschlüsseleinschränkung zu erfüllen. Schlechte Praxis, denke ich.

Siehe auch: Can a foreign key be NULL and/or duplicate?

-1

ich über die Leistung nicht kennen. Aber im Hinblick auf die Datenqualität ist null schlecht.

Null gibt Ihnen den Typ maybe, der Sie zwingt, Laufzeittypprüfung zu schreiben wie: 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).

Dieses Problem könnte gemildert werden, wenn Sie keine json/hash/array-Formate verwenden.

Aber ja, letting null exist is a billion dollar mistake.

Verwandte Themen