Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle ne fait pas la distinction entre les valeurs nulles et les chaînes vides ?

Oracle est très très très vieux.

De retour dans les 80's quand il a été développé (et avant qu'il n'y ait de normes), ils ont pensé que c'était une bonne idée, et ont ensuite utilisé Oracle stocke ses valeurs, c'était vraiment le cas.

Voici comment Oracle stocke les données (extraites de la documentation ):

Aucun type de données n'est stocké dans les données, uniquement la longueur des données et les données elles-mêmes.

Si le NULL se produit entre deux colonnes avec des valeurs, il est stocké sous la forme d'un seul octet, ce qui signifie que la colonne a une longueur 0 (en fait, 0xFF ). NULL de fin s ne sont pas stockés du tout.

Donc pour stocker la valeur 'test' , Oracle doit stocker 5 octets :04 74 65 73 74 .

Cependant, pour stocker à la fois une chaîne vide et un NULL , Oracle il suffit de définir la longueur des données sur 0 .

Très malin si vos données doivent être stockées sur 20 Mb des disques durs qui coûtent 5,000$ chacun.

Plus tard, lorsque les normes sont apparues, ce n'était plus une si bonne idée, mais à ce moment-là, il y avait déjà beaucoup de code reposant sur NULL et '' étant la même chose.

Création de VARCHAR faire une telle distinction va casser des tonnes de code.

Pour résoudre ce problème, ils ont renommé VARCHAR à VARCHAR2 (qui ne fait partie d'aucune norme), a déclaré que VARCHAR2 ne sera jamais distinguer un NULL et une chaîne vide et a exhorté tout le monde à utiliser ce type de données à la place.

Maintenant, ils attendent probablement la dernière personne qui a utilisé un VARCHAR dans Oracle base de données à mourir.