2010-06-08 12 views
9

Die Datenbankentwicklungsstandards in unserer Organisation geben an, dass die Varchar-Felder keine Nullwerte zulassen sollten. Sie sollten den Standardwert einer leeren Zeichenfolge ("") haben. Ich weiß, dass das Abfragen und Verketten einfacher macht, aber heute hat mich einer meiner Mitarbeiter gefragt, warum dieser Standard nur für Varchar-Typen und nicht für andere Datentypen (int, datetime usw.) existiere. Ich würde gerne wissen, ob andere dies als einen gültigen, vertretbaren Standard betrachten, oder ob Varchar genauso behandelt werden sollte wie Felder anderer Datentypen?Varchar-Spalten: Nullable oder nicht

Ich glaube, diese Norm aus dem folgenden Grunde gilt:

Ich glaube, dass eine leere Zeichenfolge und NULL-Werte, wenn auch technisch unterschiedlich, sind vom Konzept her gleich. Eine leere Zeichenfolge mit der Länge null ist eine Zeichenfolge, die nicht existiert. Es hat keinen Wert. Ein numerischer Wert von 0 ist jedoch nicht identisch mit NULL.

Wenn beispielsweise ein Feld mit der Bezeichnung "OutstandingBalance" den Wert 0 hat, bedeutet dies, dass $ 0,00 übrig sind. Wenn das gleiche Feld jedoch NULL ist, bedeutet dies, dass der Wert unbekannt ist. Auf der anderen Seite ist ein Feld namens CustomerName mit einem Wert von "" im Grunde das gleiche wie ein Wert von NULL, da beide die Nichtexistenz des Namens darstellen.

Ich las irgendwo, dass eine Analogie für eine leere Zeichenfolge vs. NULL die einer leeren CD vs. keine CD ist. Ich glaube jedoch, dass dies eine falsche Analogie ist, da eine leere CD immer noch physisch existiert und immer noch physischen Datenraum hat, auf den keine sinnvollen Daten geschrieben sind. Grundsätzlich glaube ich, dass eine leere CD einer Leerzeichenkette ("") entspricht, keine leere Zeichenkette. Daher glaube ich, dass eine Zeichenfolge aus Leerzeichen ein von NULL getrennter tatsächlicher Wert ist, aber eine leere Zeichenfolge, die das Nichtvorhandensein eines Werts ist, der konzeptionell dem Wert NULL entspricht.

Bitte lassen Sie mich wissen, wenn meine Überzeugungen in Bezug auf Strings variabler Länge gültig sind, oder bitte erleuchten mich, wenn sie nicht sind. Ich habe mehrere Blogs/Argumente zu diesem Thema gelesen, sehe aber immer noch keinen echten konzeptionellen Unterschied zwischen NULL und leeren Strings.

Antwort

15

Es läuft darauf hinaus - in Ihrer Anwendung, für eine bestimmte Zeichenfolge, gibt es einen Unterschied zwischen einer leeren Zeichenfolge zu überhaupt keine Zeichenfolge?

Wenn es keinen Unterschied gibt, dann ist der Standard, den Sie folgen, in Ordnung. Wenn Sie feststellen, dass es einen Unterschied gibt, dann hat der null eine eindeutige Bedeutung und sollte erlaubt sein.

Meiner Erfahrung nach wird null normalerweise so modelliert, dass es unknown bedeutet. Hier

ist ein konkretes Beispiel - Mitte Namen von Personen:

  • Wenn Sie den mittleren Namen kennen, dann wird der Wert bevölkerten
  • Wenn Sie wissen, dass die Person keinen zweiten Vornamen hat, dann verwenden eine leere Zeichenfolge (‚‘)
  • wenn Sie nicht wissen, ob eine Person einen zweiten Vornamen hat, kann ein null

Wieder besser geeignet sein, wenn Ihre Anwendung behandelt die Menschen w Mit keinem zweiten Vornamen und solchen, bei denen dies nicht identisch ist, macht es Sinn, eine leere Zeichenfolge für beide zu verwenden (auch wenn das bedeutet, dass einige Informationen verloren gehen).

+0

+1: Geschäftsregeln Laufwerk Spaltenoptionalität, nicht Datentyp. Darüber hinaus gibt es keine Platzersparnis durch die Verwendung von NULL- oder Nulllängen-Strings: http://vampirebasic.blogspot.com/2009/01/sql-server-null-varchar-vs-empty.html –

1

Nein, Null ist ein sehr unterscheidbarer Wert.Zum Beispiel - nur eines von mehr als einem Dutzend - null kann bedeuten, "wir haben überhaupt keinen Wert", während der leere String bedeutet "wir haben eine Antwort und es ist nichts." Dies wäre zum Beispiel als Antwort auf eine Frage nützlich - bekam nie eine Antwort oder die Antwort war nichts ...

Es gibt ein GROSSES Whitepaper, das da draußen herumläuft und etwas wie "die 18 Bedeutungen von NULL" betitelt - Ich weiß nicht mehr genau, was die ganze Zahl ist! Irgendwie ist dieses Papier seit mindestens Anfang der 1990er da draußen und ist wirklich fantastisch, wenn Sie es finden können - ich habe keine Websuche gemacht.

Das eigentliche Problem mit Nullen ist, dass sie "irrtümlich" ändern können, welche Zeilen zurückgegeben werden. Zum Beispiel, wenn Sie

wählen strcol1 sagen, datecol2, someint3 von fubar wo ...

Wenn strcol1 null sein geschieht, werden Sie keinen Wert zurück für diese Reihe bekommen, weil es eine ist implizierte „, wo strcol1 ist nicht null "- so kann eine ganze Zeile fehlen.

Dies gilt nicht für alle RDBMS-Systeme, aber seit einiger Zeit für einige. Wenn Sie möchten, dass Ihr Code von einem RDBMS in ein anderes verschoben werden kann, sollten Sie bei der Verarbeitung von NULLEN sehr vorsichtig sein.

Ein weiterer Punkt: Oracle - oder zumindest einige Versionen von Oracle - konvertiert leere Zeichenfolgen automatisch in null! Das ist wirklich ungeheuerlich, aber irgendwie haben sie das "für immer" in Produktion. Achtung! Meine Lösung besteht darin, eine andere Zeichenfolge zu verwenden, die "die leere Zeichenfolge" bedeutet, meistens ein einzelnes Leerzeichen.

Verwandte Themen