Ich weiß , dass es nicht so betrachten ‚‘ NULL
, aber das bedeutet nicht viel , mir zu sagen , warum dies der Fall ist. Nach meinem Verständnis der SQL-Spezifikationen ist '' nicht dasselbe wie NULL
- eines ist ein gültiges Datum, und das andere zeigt das Fehlen derselben Informationen an.
Sie können gerne spekulieren, aber bitte geben Sie an, ob dies der Fall ist. Wenn es jemanden von Oracle gibt, der dies kommentieren kann, wäre das fantastisch!
Antworten:
Ich glaube, die Antwort ist, dass Oracle sehr, sehr alt ist.
In den alten Tagen, bevor es einen SQL-Standard gab, traf Oracle die Entwurfsentscheidung, dass leere Zeichenfolgen in
VARCHAR
/VARCHAR2
Spalten vorhanden warenNULL
und dass es nur einen Sinn für NULL gab (es gibt relationale Theoretiker, die zwischen Daten unterscheiden würden, nach denen nie gefragt wurde). Daten, bei denen die Antwort vorhanden ist, dem Benutzer jedoch nicht bekannt ist, Daten, bei denen keine Antwort vorliegt usw., die alle einen Sinn fürNULL
) darstellen.Zu dem Zeitpunkt, als der SQL-Standard eingeführt wurde und zustimmte, dass
NULL
und die leere Zeichenfolge unterschiedliche Entitäten waren, gab es bereits Oracle-Benutzer, deren Code davon ausging, dass beide gleichwertig waren. Oracle hatte also im Grunde die Möglichkeit, vorhandenen Code zu beschädigen, gegen den SQL-Standard zu verstoßen oder eine Art Initialisierungsparameter einzuführen, der die Funktionalität einer möglicherweise großen Anzahl von Abfragen ändern würde. Die Verletzung des SQL-Standards (IMHO) war die am wenigsten störende dieser drei Optionen.Oracle hat die Möglichkeit offen gelassen, dass sich der
VARCHAR
Datentyp in einer zukünftigen Version ändert, um dem SQL-Standard zu entsprechen (weshalb jederVARCHAR2
in Oracle verwendet, da das Verhalten dieses Datentyps in Zukunft garantiert gleich bleibt).quelle
Tom Kyte VP von Oracle:
quelle
''
wird implizit in einen VARCHAR2 umgewandelt, wiecast('' as char(1)) is null
die ... raschend TRUEIch vermute, dass dies viel sinnvoller ist, wenn Sie Oracle so betrachten, wie es frühere Entwickler wahrscheinlich getan haben - als verherrlichtes Backend für ein Dateneingabesystem. Jedes Feld in der Datenbank entsprach einem Feld in einer Form, die ein Dateneingabebetreiber auf seinem Bildschirm sah. Wenn der Bediener nichts in ein Feld eingegeben hat, sei es "Geburtsdatum" oder "Adresse", sind die Daten für dieses Feld "unbekannt". Ein Operator kann nicht angeben, dass die Adresse einer Person wirklich eine leere Zeichenfolge ist, und das macht sowieso nicht viel Sinn.
quelle
Die Oracle-Dokumentation weist Entwickler auf dieses Problem hin und reicht mindestens bis Version 7 zurück.
Oracle entschied sich dafür, NULLS durch die "Unmögliche Wert" -Technik darzustellen. Beispielsweise wird ein NULL-Wert an einer numerischen Stelle als "minus Null" gespeichert, ein unmöglicher Wert. Alle Minus-Nullen, die sich aus Berechnungen ergeben, werden vor dem Speichern in eine positive Null umgewandelt.
Oracle entschied sich fälschlicherweise auch dafür, die VARCHAR-Zeichenfolge mit der Länge Null (die leere Zeichenfolge) als unmöglichen Wert und als geeignete Wahl für die Darstellung von NULL zu betrachten. Es stellt sich heraus, dass die leere Zeichenfolge weit von einem unmöglichen Wert entfernt ist. Es ist sogar die Identität unter der Operation der String-Verkettung!
Die Oracle-Dokumentation warnt Datenbankdesigner und -entwickler, dass eine zukünftige Version von Oracle diese Zuordnung zwischen der leeren Zeichenfolge und NULL möglicherweise aufheben und jeden Code aufheben kann, der von dieser Zuordnung abhängt.
Es gibt Techniken, um andere NULL-Werte als unmögliche Werte zu kennzeichnen, aber Oracle hat sie nicht verwendet.
(Ich verwende das Wort "Ort" oben, um den Schnittpunkt einer Zeile und einer Spalte zu bezeichnen.)
quelle
Leere Zeichenfolge ist dasselbe wie NULL, einfach weil es das "geringere Übel" ist, verglichen mit der Situation, in der die beiden (leere Zeichenfolge und Null) nicht gleich sind.
In Sprachen, in denen NULL und leerer String nicht identisch sind, müssen immer beide Bedingungen überprüft werden.
quelle
not null
Einschränkung für Ihre Spalte fest und überprüfen Sie nur die leere Zeichenfolge.WHERE Field <> ''
Gibt in Datenbanken mit ANSI-Verhalten für leere Zeichenfolgen nur dann true zurück, wenn das Feld nicht NULL und nicht leer ist.Laut offiziellen 11g-Dokumenten
Mögliche Gründe
val IS NOT NULL
ist besser lesbar alsval != ''
val != '' and val IS NOT NULL
quelle
val <> ''
schließt bereits ausNULL
. Vielleicht hast du es gemeintval = '' OR val IS NULL
. Aber leere Zeichenfolgen, die nicht als NULL verglichen werden, sind nützlich !Beispiel aus dem Buch
quelle
Weil es auch nicht besonders hilfreich ist, es nicht als NULL zu behandeln.
Wenn Sie in diesem Bereich bei Oracle einen Fehler machen, bemerken Sie dies normalerweise sofort. In SQL Server scheint es jedoch zu funktionieren, und das Problem tritt nur auf, wenn jemand eine leere Zeichenfolge anstelle von NULL eingibt (möglicherweise aus einer .net-Clientbibliothek, in der sich null von "" unterscheidet, Sie diese jedoch normalerweise gleich behandeln ).
Ich sage nicht, dass Oracle Recht hat, aber es scheint mir, dass beide Wege ungefähr gleich schlecht sind.
quelle
In der Tat hatte ich nur Schwierigkeiten im Umgang mit Oracle, einschließlich ungültiger Datums- / Uhrzeitwerte (kann nicht gedruckt, konvertiert oder irgendetwas, nur mit der DUMP () - Funktion betrachtet werden), die anscheinend durch einen Buggy in die Datenbank eingefügt werden dürfen Version des Clients als Binärspalte! Soviel zum Schutz der Datenbankintegrität!
Oracle-Behandlung von NULL-Links:
http://digitalbush.com/2007/10/27/oracle-9i-null-behavior/
http://jeffkemponoracle.com/2006/02/empty-string-andor-null.html
quelle
Erstens wurden null und null string von Oracle nicht immer als gleich behandelt. Eine Nullzeichenfolge ist per Definition eine Zeichenfolge, die keine Zeichen enthält. Dies ist überhaupt nicht dasselbe wie eine Null. NULL ist per Definition das Fehlen von Daten.
Vor ungefähr fünf oder sechs Jahren wurde die Nullzeichenfolge von Oracle anders behandelt als die Null. Während, wie null, null string gleich allem war und sich von allem unterschied (was meiner Meinung nach für null in Ordnung ist, aber für null string völlig FALSCH), würde mindestens die Länge (null string) 0 zurückgeben, wie es sollte, da null string ist eine Zeichenfolge mit der Länge Null.
Derzeit gibt in Oracle die Länge (null) null zurück, was meiner Meinung nach in Ordnung ist, aber die Länge (null string) gibt auch null zurück, was völlig FALSCH ist.
Ich verstehe nicht, warum sie beschlossen haben, diese beiden unterschiedlichen "Werte" gleich zu behandeln. Sie bedeuten verschiedene Dinge und der Programmierer sollte die Fähigkeit haben, auf unterschiedliche Weise auf jedes zu reagieren. Die Tatsache, dass sie ihre Methodik geändert haben, zeigt mir, dass sie wirklich keine Ahnung haben, wie diese Werte behandelt werden sollen.
quelle
VARCHAR
Feld einen Wert (null oder mehr Zeichen) oder keinen Wert (NULL) haben.NULL
und einer nullwertigen Zeichenfolge, und eine solche Unterscheidung macht keinen Sinn. Ich fürchte, diese Antwort ist eine völlige Fantasie.