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

Cette implémentation est-elle conforme à SQL-92 ?

Non, le traitement des valeurs nulles par Oracle est idiosyncrasique, différent de celui des autres et incompatible avec les normes ANSI. Cependant, pour la défense d'Oracle, il a probablement opté pour ce traitement et s'y est engagé bien avant qu'il n'y ait une norme ANSI à respecter !

Tout commence par le fait qu'Oracle stocke les chaînes avec un nombre de caractères suivi des données de la chaîne. Un NULL est représenté par un nombre de caractères de zéro sans données de chaîne suivantes - ce qui est exactement la même chose qu'une chaîne vide (''). Oracle n'a tout simplement aucun moyen de les distinguer.

Cela conduit à un comportement bizarre, comme ce cas de concaténation. Oracle dispose également d'une fonction LENGTH pour renvoyer la longueur d'une chaîne, mais celle-ci a été définie de manière opposée, de sorte que LENGTH('') renvoie NULL et non zéro. Donc :

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

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

ce qui me semble violer les principes mathématiques de base.

Bien sûr, les développeurs d'Oracle s'y sont tellement habitués que beaucoup d'entre nous ne voient même rien de mal ou d'étrange à ce sujet - certains diront en fait que le reste du monde a tort et qu'une chaîne vide et un NULL sont la même chose !