Das Verhalten von NULL
verursacht immer wieder Verwirrung. Obwohl die grundlegende Idee der NULL
– fehlende Daten zu repräsentieren – recht einfach ist, gibt es einige Besonderheiten. Anstatt des Ist-gleich-Operators (= NULL)
muss man zum Beispiel IS NULL
verwenden. Bei der Oracle Datenbank gehen die „Besonderheiten“ aber noch weiter. Einerseits, weil sie NULL
nicht immer so behandelt, wie es der Standard vorsieht. Andererseits aber auch, weil sie einen ganz „speziellen“ Umgang mit NULL
in Indizes hat.
Der SQL-Standard definiert NULL
nicht als Wert, sondern als Platzhalter für einen fehlenden Wert. Folgerichtig kann kein Wert NULL
sein. Die Oracle Datenbank behandelt einen leeren String aber wie NULL
:
SELECT '0 IS NULL???' AS "what is NULL?" FROM dual
WHERE 0 IS NULL
UNION ALL
SELECT '0 is not null' FROM dual
WHERE 0 IS NOT NULL
UNION ALL
SELECT ''''' IS NULL???' FROM dual
WHERE '' IS NULL
UNION ALL
SELECT ''''' is not null' FROM dual
WHERE '' IS NOT NULL
Um die Verwirrung zu vervollständigen, gibt es natürlich auch einen Fall, bei dem die Oracle Datenbank eine NULL
wie einen leeren String behandelt:
SELECT dummy
, dummy || ''
, dummy || NULL
FROM dual
Die Verbindung der Spalte DUMMY
(immer mit 'X'
gefüllt) mit NULL
sollte NULL
ergeben.
Das Konzept der NULL
kommt in vielen Programmiersprachen vor. Aber egal wohin man blickt, ein leerer String ist niemals NULL
. Ausgenommen bei der Oracle Datenbank. Hier ist es sogar unmöglich, einen leeren String in einem VARCHAR2
-Feld abzuspeichern. Wenn man es versucht, wird einfach NULL
gespeichert.
Diese Besonderheiten ist nicht nur merkwürdig, sondern sogar gefährlich. Insbesondere da die NULL
-Kuriosität bei der Indizierung weitergeht.