NULL oder leerer String effizienter / natürlicher? [geschlossen]

8

Vorwand, ich kenne die semantischen Unterschiede zwischen einem NULL-Wert und einer leeren Zeichenfolge.

Ich habe eine MySQL-Tabelle, in der ich viele Hostnamen mit ihren IP-Adressen (als String) abspeichere und mich wundere, was natürlicher (oder effizienter Speicher) erscheinen würde, falls ein Hostname nicht aufgelöst werden kann. p>

Ein NULL-Wert oder eine leere Zeichenfolge (in diesem Fall sollte es wahrscheinlich ein VARCHAR und kein CHAR sein)

Ich würde zu einem Nullwert neigen, aber ich möchte dies bestätigt oder nicht bestätigen lassen.

    
user2352129 05.05.2013, 14:56
quelle

4 Antworten

4

In MyISAM MYSQL speichern Sie ein Bit pro Zeile ohne NULL . Wie es hier heißt:

  

Das Deklarieren von Spalten NULL kann die maximale Anzahl zulässiger Spalten reduzieren. Für MyISAM -Tabellen benötigen NULL-Spalten zusätzlichen Platz in der Zeile, um aufzuzeichnen, ob ihre Werte NULL sind. Jede NULL-Spalte benötigt ein zusätzliches Bit, aufgerundet auf das nächste Byte.

Sehen Sie sich auch hier an:

  

Während NULL selbst keinen Speicherplatz benötigt, reserviert NDBCLUSTER 4 Byte pro Zeile, wenn die Tabellendefinition Spalten enthält, die als NULL definiert sind, bis zu 32 NULL-Spalten. (Wenn eine MySQL Cluster-Tabelle mit mehr als 32 NULL-Spalten bis zu 64 NULL-Spalten definiert ist, sind 8 Byte pro Zeile reserviert.)

Außerdem lässt es auch die Datenbank schneller arbeiten bei der angegebenen hier (aus stackoverflow - @DavidWinterbottom Link funktionierte nicht für mich, ich habe eine andere Quelle hinzugefügt)

  

Es ist schwieriger für MySQL, Abfragen zu optimieren, die auf Nullable-Coumns verweisen, weil sie Indizes, Indexstatistiken und Wertvergleiche komplizierter machen. Eine NULL-fähige Spalte benötigt mehr Speicherplatz und erfordert eine spezielle Verarbeitung in MySQL. Wenn eine Nullable-Spalte indiziert wird, benötigt sie ein zusätzliches Byte pro Eintrag und kann sogar bewirken, dass eine feste Größe (z. B. ein Index für eine einzelne Ganzzahlspalte) in MyISAM in eine variable Größe konvertiert wird.

In den meisten Fällen verhalten sich Nicht-NULL-Werte vorhersagbarer, wenn sie mit COUNT() und anderen Aggregationsfunktionen kombiniert werden, aber Sie können auch sehen, dass sich NULL entsprechend Ihren Anforderungen verhält.

Wie es hier heißt, nicht alle Gruppen (Aggregat) -Funktionen ignorieren NULL , zum Beispiel würde COUNT() Ihnen ein anderes Ergebnis geben als COUNT(*) für eine Spalte, die NULL-Werte enthält.

Andererseits, wenn ein anderer Punkt NULL die Bedeutung des Eintrags besser widerspiegelt - es ist ein unbekannter Wert und wenn Sie alle Hosts zählen wollten, würden Sie wahrscheinlich COUNT() genauso verhalten wie sie.

    
Legat 05.05.2013, 15:02
quelle
1

Oracle hat das Problem gelöst und interpretiert beides.

Mysql nicht, ich beurteile es nicht, aber persönlich mag ich es nicht, also benutze NULL so viel wie ich kann, um meinen Code zu "standardisieren".

Plus, aus der Sicht der Bedeutung der Schlüsselwörter ist NULL genau das, was Sie wollen, weil es "unbekannt" in der db-Semantik bedeutet. (korrigieren Sie mich, wenn ich falsch liege)

    
Sebas 05.05.2013 14:59
quelle
1

Zuerst : Beachten Sie die verschiedenen Semantiken von NULL und Empty-String .

  • Die erste wird am besten wie folgt interpretiert:
    Es gibt einen gültigen Wert für dieses Feld, aber dieser Wert ist noch nicht bekannt .
  • Das zweite bedeutet immer:
    Der gültige Wert für dieses Feld ist bekannt, und zwar genau "" .

Sekunde : Erkennen Sie, dass das Indizieren und Filtern auf Empty-String besser und effizienter funktioniert als auf NULL . Verwenden Sie daher nicht das Letzteres, wenn Sie das erste wirklich meinen.

Third : Erkennt, dass alle Ausdrücke, die NULL verwenden, anfällig für die Nicht-Intuitivität dreiwertiger Logik sind, es sei denn, der NULL ist religiös zu Empty- verschmolzen. String (oder ein anderer kontextuell gültiger Wert) zuerst. Insbesondere gilt das Gesetz der ausgeschlossenen Mitte nicht mehr, so dass der Ausdruck A oder ~ A nicht mehr tautologisch wahr ist, wenn die Bewertung von A die Bewertung eines erfordert NULL Begriff. Das zu vergessen, kann zu sehr subtilen und schwer zu lokalisierenden Fehlern führen.

Der Nicht-Gleich-Operator macht dies regelmäßig verfügbar:

%Vor%

Aktualisieren :
Ich denke, das Wesentliche meiner Aussage ist, dass sie NICHT die gleiche Kreatur sind, sondern sehr unterschiedliche Bestien. Jeder hat seinen Platz. Ein zweites Adressfeld sollte immer nicht Null sein (es sei denn, Sie möchten die Eingabe von unvollständigen oder unvollständigen Adressen zulassen), und es sollte immer der gültige und bekannte Wert von Empty-String sein. NULL sollte auf Fälle beschränkt sein, in denen später ein gültiger und bekannter Wert geliefert wird, und in der Tat eine Art von Validierungsfehler signalisieren, der behoben werden muss.

Von OP unten:

  

Eine Zeile wird nicht aktualisiert. Auf der Einfügung gibt es entweder eine IP   Adresse oder es gibt keine (weil es nicht gelöst werden konnte).

Antwort:

Dann empfehle ich die Verwendung von Empty-String als Standard und mache das Feld NON-NULL. Verwenden Sie nur NULL , wenn Sie dies tun müssen, da es subtile Nachteile hat.

    
Pieter Geerkens 05.05.2013 15:46
quelle
0

Ich empfehle Ihnen, NULL zu verwenden, während der Typ von NULL sich von string unterscheidet. Es ist beispielsweise einfacher, Zeilen mit diesem Wert herauszufiltern oder einen Werttyp in diesem Feld zu erkennen usw.

    
jjurm 05.05.2013 15:00
quelle