Soll ich NULL oder eine leere Zeichenfolge keine Daten in Tabellenspalten zu vertreten?

StackOverflow https://stackoverflow.com/questions/167952

  •  03-07-2019
  •  | 
  •  

Frage

Null oder eine leere Zeichenfolge - ist eine besser als die andere keine Daten in einer Tabellenspalte zu vertreten? (I speziell MySQL verwenden, aber ich denke, das ist systemunabhängig.) Gibt es große Vorteile / Nachteile übereinander, oder ist es einfach Programmierer Präferenz?

War es hilfreich?

Lösung

ich stark mit jedem zustimmen, der sagt bedingungslos NULL zu verwenden. NULL sein führt einen zusätzlichen Zustand eine Spalte Zulassen, dass Sie nicht, wenn Sie die Spalte haben würde sich als NOT NULL gesetzt. Tun Sie dies nicht, wenn Sie den zusätzlichen Zustand nicht brauchen. Das heißt, wenn Sie nicht mit einem Unterschied zwischen der Bedeutung von leeren String und der Bedeutung von null kommen können, dann die Spalte einrichten als NOT NULL und verwenden leere Zeichenfolge leer darzustellen. Stellvertretend für die gleiche Sache auf zwei verschiedene Arten ist eine schlechte Idee.

Die meisten der Menschen, die sagten Sie NULL zu verwenden, auch ein Beispiel gab, wo NULL etwas anderes als leere Zeichenfolge bedeuten würde. Und in diesen Beispielen, sind sie recht.

Die meiste Zeit aber ist NULL ein unnötiger zusätzlicher Zustand, der nur Programmierer zwingt zu mehr Fälle behandeln zu müssen. Wie andere erwähnt haben, ist Oracle nicht dieser zusätzliche Zustand erlauben zu existieren, weil es NULL und leere Zeichenkette als die gleiche Sache behandelt (es ist unmöglich, eine leere Zeichenfolge in einer Spalte zu speichern, die nicht null in Oracle erlaubt).

Andere Tipps

Null. Ein leerer String ist nicht „keine Daten“, seine Daten, die leer sein geschehen.

Null ist besser „“ stellt tatsächlich Daten und es wird nicht das gleiche in Ihrem Code registriert

Im Rahmen des relationalen Datenbankmodell, zeigt null „keinen Wert“ oder „unbekannten Wert“. Es besteht aus genau dem Zweck Sie beschreiben.

UPDATE: Sorry, ich vergaß, dass hinzufügen, während die meisten (alle?) RDMBSs diese gleiche Definition verwenden für null, gibt es nuancierte Unterschiede, wie null behandelt wird. Zum Beispiel, MySQL und Oracle mehr Nullen in einer UNIQUE Spalte ermöglichen (oder Gruppe von Spalten), da null keinen Wert ist, und nicht eindeutig angesehen werden kann (null! = Null). Aber das letzte Mal, dass ich MS SQL Server verwendet, es erlaubt nur eine einzige Null. So müssen Sie möglicherweise das RDBMS Verhalten prüfen, und ob die betreffenden Spalt eingeschränkt werden oder indiziert.

Weder noch. Repräsentieren Fehlen von Daten als Abwesenheit von Tupeln in einer Beziehung.

Aus Performance Gründe, weshalb Sie schließt sich in einigen RDBMS zu vermeiden‘, sondern versuchen, das Modell so zu gestalten, dass die Informationen, die in einem separaten Beziehung fehlt kann.

Hier sind ein paar Links von der MySQL-Website:

http://dev.mysql.com /doc/refman/5.0/en/problems-with-null.html

http://dev.mysql.com /doc/refman/5.0/en/working-with-null.html

Ich habe einmal gelesen, dass ein NULL Wert 2 Bits ist, wobei als eine leere Zeichenkette nur 1 Bit ist. 99% der Zeit, dies wird keinen Unterschied machen, aber in einem sehr großen Tisch, wenn es keine Rolle spielt, wenn NULL oder '', dann könnte es besser sein '' zu verwenden, wenn dies wahr ist.

Immer NULL verwenden. Betrachten Sie den Unterschied zwischen „Ich weiß nicht, was diese Telefonnummer einer Person ist“ (NULL) und „diese Person beließ es blank“ (leer).

Verwenden Sie das richtige Werkzeug für den Job. NULL kann bedeuten, dass kein Wert angegeben wurde (noch) nicht, oder es kann bedeuten, dass kein Wert anwendbar ist.

Aber eine leere Zeichenfolge ist zu Informationen. Es kann bedeuten, dass ein Wert anwendbar ist, und wurde gegeben, aber es passiert eine leere Zeichenkette sein.

Zulassen eine Spalte sowohl NULL und ‚enthalten‘ gibt Ihnen die Möglichkeit, zwischen diesen Fällen zu unterscheiden. Auf jedem Fall ist es nicht gut zu verwenden, um die andere zu bedeuten.

Beachten Sie, dass in String-Verkettung, was mit NULL kombiniert ergibt NULL. Zum Beispiel: CONCAT (NULL 'foo') ergibt NULL. Lernen Sie die COALESCE () Funktion verwenden, wenn Sie NULL zu einem gewissen Standardwert in einem SQL-Ausdruck konvertiert werden sollen.

Die meiste Zeit null ist besser. Es gibt wahrscheinlich einige Situationen, in denen es kaum einen Unterschied macht, aber sie sind wenige. Denken Sie daran, wenn Sie fragen, dass field = '' nicht das gleiche wie field is null ist (in MySQL, zumindest).

Soweit ich das beurteilen kann, Oracle unterscheiden macht keinen Unterschied.

select 1 from (select '' as col  from dual) where col is null;

Betrachten wir, warum es keine Daten in der Spalte ist. Bedeutet es, die Tabelle Design schlampig? Trotz der nicht NULL-Werte mögen, gibt es Gelegenheiten, bei denen sie angemessen sind (oder, angemessen genug), und das System wird in der Regel nicht sterben. Nur nie Nullen in etwas erlauben, die einen Kandidatenschlüssel (primärer oder alternativer Schlüssel) ist.

Erstellen Sie eine separate Tabelle nur für die Nullable-Säule und einem Fremdschlüssel der Haupttabelle. Wenn ein Datensatz hat keine Daten für diese Spalte, dann wird es keinen Datensatz in der zweiten Tabelle hat. Dies ist die sauberste Lösung und Sie nicht über den Umgang mit NULL-Wert oder gibt eine besondere Bedeutung zu leere Zeichenfolge kümmern.

NULL ist ein nicht-Wert, der zu den dunklen Zeiten verbannt werden soll, von wo sie entstanden. Ich habe festgestellt, dass es eine nicht-triviale Menge der Programmierung ist erforderlich Spezial-NULL-Fälle zu behandeln, die sich leicht mit einem Standardwert behandelt werden könnten.

Legen Sie den Standard für die Spalte eine leere Zeichenkette sein. Erzwingen Sie die Spalte nicht null zu ermöglichen, die höchstwahrscheinlich nie passieren würde, wenn Sie einen Standardwert zuweisen. Schreiben Sie Ihren Code wohlig ignoriert den Fall, dass der Spaltenwert ist null.

Ein großes Problem ich mit NULL immer gehabt habe, ist, dass „SELECT * FROM tbl WHERE column = NULL“ wird immer eine leere Ergebnismenge zurück. NULL kann nie zu etwas bringen, einschließlich NULL gleich sein. Das speical Stichwort „-Spalte ist null“ ist die einzige Möglichkeit, zu überprüfen, für null etwas zu sein. Wenn Sie wieder weg von null, dann wird der Vergleich erfolgreich sein. „Spalte =‚‘“ 7 Zeilen zurückgegeben

Ich habe zwei große DB getan Implementierungen von Grund auf, wo am Ende habe ich NULL bedauerte habe mit. Das nächste Mal, keine NULL-Werte für mich!

Es gibt eine wichtige Ausnahme. Bill Karwin erklärte: "CONCAT (NULL, 'foo') ergibt NULL", was für die meisten RDBMS wahr ist, aber nicht für Oracle.

Wie bereits von James Curran vorgeschlagen, entschied sich Oracle diesen eher kritischen Punkt von Standard-SQL abweichen von NULLs und leere Strings genau die gleiche Behandlung. Schlimmer als nur ihnen die gleiche Behandlung, aber es kann tatsächlich korrupt die Bedeutung eines NULL-Wert durch etwas anderes als NULL zurückkehrt, wenn verketten.

Insbesondere in Oracle CONCAT (NULL 'foo') ergibt 'foo'. Dank Oracle, ich habe meine nulls jetzt verloren, die möglicherweise keine Rolle, sondern stellt sicher einen Unterschied, wenn die Daten an andere RDBMS-Systeme zur Weiterverarbeitung übergeben wird.

A „keine Daten“ Wert in einer Spalte sollte durch einen Standardwert dargestellt werden. Denken Sie daran, dass NULL einen unbekannten Wert bedeutet, das heißt, kann die Spalte einen Wert hat oder nicht, aber Sie wissen es nicht, wie diese Zeit.

In einem Darlehen Anwendungssystem zum Beispiel ein NULL-Wert auf der Lizenznummer Feld des Fahrers bedeutet, dass der Antragsteller oder der Kredit-Prozessor hat nicht Eingang die Führerscheinnummer. Der NULL-Wert nicht automatisch den Antragsteller bedeutet nicht über eine Lizenz. Er kann oder kann nicht eine Lizenz haben, Sie wissen einfach nicht, das ist, warum es NULL ist.

Die Zweideutigkeit liegt für String-Spalten. Eine numerische Spalte enthält offensichtlich eine Null, wenn kein Wert ist. Wie können Sie repräsentieren eine kein Wert Zeichenfolge? In dem obigen Beispiel für Bewerber mit keinen Führerschein, können Sie einen beliebigen Standardwert wie „none“ oder besser noch einen leeren String zuweisen. Einfach sicher, dass Sie den Standard leeren Wert in Ihren anderen Tabellen für Konsistenz verwenden.

In der Frage der nicht NULL-Wert als Prinzip verwendet, gibt es Fälle, in denen sie in der Tat von wesentlicher Bedeutung. Als jemand, der sich intensiv mit Statistiken arbeitet, ist es für Datenanbietern gemeinsam Sie Datensätze mit unvollständigen Daten zu geben. Zum Beispiel in einem Datensatz des BIP pro Land, können Sie fehlende BIP-Zahlen in den früheren und späteren Jahren finden. Ein Grund dafür ist, dass es keine offiziellen Daten für die Jahre von der Regierung des Landes. Es wird falsch zu dem Schluss, dass ihre BIP-Null (DUH!) Und zeigt einen Nullwert in den extrahierten Daten oder ein Diagramm. Der korrekte Wert ist NULL, dh Sie noch nicht über die Daten haben. Der Endbenutzer korrekt interpretiert die fehlende Datenpunkte in den extrahierten Daten und Grafiken als nicht Null. Darüber hinaus wird es keine Fehler in Ihren Berechnungen verursacht vor allem, wenn Sie mitteln tun.

Einige „Regeln“, der Sinn macht theoretisch wären in der Tat eine schlechte oder falsche Lösung in Ihrem Fall sein.

Ich finde NULL-Werte für die referentielle Integrität hilfreich sein. Im Fall von MySQL, wenn ein Feld NOT NULL gesetzt ist, dann erfordert ein Einsatz der Daten festgelegt werden; andernfalls NULL ist ein möglicher Wert und Fremdschlüssel erzwungen wird nicht.

  1. id: Primärschlüssel
  2. product_id: FOREIGN KEY NOT NULL
  3. REF_ID: (NULLABLE)

id und product_id Bereich immer erforderlich. REF_ID kann auf NULL gesetzt werden. Wenn jedoch ein anderer Wert verwendet wird, muss sie die FOREIGN KEY-Einschränkung erfüllen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top