Je crois que la réponse est qu'Oracle est très, très ancien.
Autrefois, avant qu'il n'y ait une norme SQL, Oracle a pris la décision de conception que les chaînes vides dans VARCHAR
/VARCHAR2
les colonnes étaient NULL
et qu'il n'y avait qu'un seul sens de NULL (il y a des théoriciens relationnels qui différencieraient les données qui n'ont jamais été demandées, les données où la réponse existe mais n'est pas connue de l'utilisateur, les données où il n'y a pas de réponse, etc. qui constituent un certain sens de NULL
).
Au moment où la norme SQL est arrivée et a convenu que NULL
et la chaîne vide étaient des entités distinctes, il y avait déjà des utilisateurs Oracle qui avaient du code qui supposait que les deux étaient équivalents. Ainsi, Oracle se retrouvait essentiellement avec les options de casser le code existant, de violer la norme SQL ou d'introduire une sorte de paramètre d'initialisation qui modifierait la fonctionnalité d'un nombre potentiellement important de requêtes. La violation de la norme SQL (IMHO) était la moins perturbatrice de ces trois options.
Oracle a laissé ouverte la possibilité que le VARCHAR
le type de données changerait dans une future version pour adhérer à la norme SQL (c'est pourquoi tout le monde utilise VARCHAR2
dans Oracle puisque le comportement de ce type de données est garanti pour rester le même à l'avenir).