Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ist diese Implementierung SQL-92-konform?

Nein, die Behandlung von Nullen durch Oracle ist idiosynkratisch, unterscheidet sich von der aller anderen und steht nicht im Einklang mit den ANSI-Standards. Zur Verteidigung von Oracle muss man jedoch sagen, dass es sich wahrscheinlich auf diese Behandlung festgelegt hat und sich dieser Behandlung verschrieben hat, lange bevor es einen ANSI-Standard gab, mit dem es übereinstimmen musste!

Alles beginnt damit, dass Oracle Zeichenfolgen mit einer Zeichenanzahl speichert, gefolgt von den Zeichenfolgendaten. Eine NULL wird durch eine Zeichenanzahl von Null ohne nachfolgende Zeichenfolgendaten dargestellt - was genau dasselbe ist wie eine leere Zeichenfolge (''). Oracle hat einfach keine Möglichkeit, sie zu unterscheiden.

Dies führt zu einem merkwürdigen Verhalten, wie z. B. diesem Verkettungsfall. Oracle hat auch eine Funktion LENGTH, um die Länge eines Strings zurückzugeben, aber diese wurde auf umgekehrte Weise definiert, sodass LENGTH('') NULL und nicht Null zurückgibt. Also:

LENGTH('abc') + LENGTH('') IS NULL

LENGTH('abc' || '') = 3

das scheint mir grundlegende mathematische Prinzipien zu verletzen.

Natürlich haben sich Oracle-Entwickler so daran gewöhnt, dass viele von uns nicht einmal etwas Falsches oder Seltsames daran erkennen können - einige werden sogar argumentieren, dass der Rest der Welt falsch liegt und dass ein leerer String und ein NULL sind dasselbe!