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

Oracle unterscheidet nicht zwischen Nullen und leeren Zeichenfolgen?

Oracle ist sehr sehr sehr alt.

Zurück in den 80's als es entwickelt wurde (und bevor es irgendwelche Standards gab) hielten sie es für eine gute Idee und gaben dann Oracle den Weg speichert seine Werte, es war wirklich.

So funktioniert Oracle speichert Daten (entnommen aus der Dokumentation ):

Innerhalb der Daten wird kein Datentyp gespeichert, nur die Datenlänge und die Daten selbst.

Wenn der NULL zwischen zwei Spalten mit Werten auftritt, wird es als einzelnes Byte gespeichert, was bedeutet, dass die Spalte die Länge 0 hat (eigentlich 0xFF ). Nachfolgendes NULL s werden überhaupt nicht gespeichert.

Also um den Wert 'test' zu speichern , Oracle muss 5 Bytes speichern:04 74 65 73 74 .

Allerdings, um sowohl einen leeren String als auch einen NULL zu speichern , Oracle muss nur die Datenlänge auf 0 setzen .

Sehr schlau, wenn Ihre Daten auf 20 Mb gespeichert werden sollen Festplatten, die 5,000$ kosten jeweils.

Später, als die Standards auftauchten, war das keine so gute Idee mehr, aber zu diesem Zeitpunkt gab es bereits sehr viele Codes, die auf NULL angewiesen waren und '' dasselbe sein.

Erstellen von VARCHAR eine solche Unterscheidung zu machen, wird Tonnen brechen des Codes.

Um das Problem zu beheben, wurde VARCHAR umbenannt zu VARCHAR2 (was nicht Teil eines Standards ist), gab an, dass VARCHAR2 wird nie zwischen einem NULL unterscheiden und einen leeren String und forderte alle auf, stattdessen diesen Datentyp zu verwenden.

Jetzt warten sie wahrscheinlich auf die letzte Person, die einen VARCHAR verwendet hat in Oracle Datenbank zu sterben.