Laut offiziellen 11g-Dokumenten
Oracle Database behandelt derzeit einen Zeichenwert mit einer Länge von Null als Null. Dies dürfte jedoch in Zukunft nicht mehr der Fall sein Releases, und Oracle empfiehlt, dass Sie keine leeren Strings behandeln das gleiche wie Nullen.
Betrachten Sie eine Funktion getVersion
, die ein varchar2 zurückgibt, das möglicherweise ''
:
Dies wird auf dem aktuellen Oracle 11g korrekt funktionieren, kann aber brechen, sobald zukünftige Oracle-Versionen ''
anders behandeln als null
.
Der einzige Weg, den ich sehe, um den obigen Zukunftsbeweis zu machen, ist:
if l_version is null or l_version = '' then
Gibt es einen weniger umständlichen Weg?
Wenn Sie varchar2
im gesamten Code verwenden, ist l_version is null
zukunftssicher.
Oracle hat den Datentyp varchar2
erstellt, als die ANSI-Standards deklarierten, dass varchar
NULL und die leere Zeichenfolge als separate Entitäten behandeln sollte. Die Absicht war, dass das Verhalten des varchar2
-Datentyps in Zukunft konsistent bleiben würde, während varchar
in der Zukunft die neue Standard-NULL-Vergleichssemantik verwenden könnte. Natürlich sind heute varchar
und varchar2
Synonyme für einander und das seit mindestens ein paar Jahrzehnten, so dass die Wahrscheinlichkeit, dass Oracle das Verhalten des varchar
-Datentyps in der Zukunft ändert, ziemlich niedrig ist.
Wenn Sie sich die Dokumentation für VARCHAR2
und VARCHAR
ansehen Datentypen , es wird über die Vergleichssemantik für VARCHAR
gesprochen, die sich möglicherweise in der Zukunft ändert. Leider ist es nicht explizit, dass die Vergleichssemantik, über die sie sprechen, die Äquivalenz (oder das Fehlen davon) zwischen NULL und der leeren Zeichenfolge ist. Aber da VARCHAR
ein ANSI-Standarddatentyp ist und der einzige Unterschied in VARCHAR
Vergleichssemantik zwischen Oracle und dem ANSI-Standard ist, ob die leere Zeichenkette NULL ist, das ist die allgemein akzeptierte Interpretation.
Verwenden Sie nicht den VARCHAR-Datentyp. Verwenden Sie stattdessen den VARCHAR2-Datentyp. Obwohl der VARCHAR-Datentyp derzeit gleichbedeutend mit VARCHAR2 ist, Der VARCHAR-Datentyp wird als neu definiert Datentyp, der für Zeichenketten mit variabler Länge verwendet wird verschiedene Vergleichssemantiken.
Wenn sich das Verhalten ändert, wollen Sie dann nicht zwischen leerer Zeichenkette und Null unterscheiden können, wenn so etwas möglich ist? Mit anderen Worten, ein zukunftssicherer Code, der leere Strings und Nullen als denselben behandelt, wird wahrscheinlich in der Zukunft sowieso wieder auftauchen müssen.
Außerdem gibt es derzeit etwa 100 Milliarden Billionen Null-Strings, die weltweit in Oracle-Datenbanken gespeichert sind und weiterhin null sein werden.
Also mein Rat ist es zu vergessen, und benutze einfach IS NULL.
Klingt wie ein Anwalt in Oracles Dokumentation. Ich kann mir in einer Million Jahren nicht vorstellen, dass Oracle plötzlich ändern würde, wie sie mit varchar2 mit leeren Strings umgehen, eine TON Code würde brechen (und vieles davon still). Diese Aussage in den Dokumenten scheint für alle Fälle ein "Cover your a $$" zu sein. Also, benutze einfach "is null" und mach dir keine Sorgen. Wenn überhaupt, ändern sie das varchar-Verhalten, nicht varchar2.
Meine 2 Cent sowieso.