Pourquoi Oracle 9i traite-t-il une chaîne vide comme NULL?

Je sais que cela prend en compte ” comme NULL , mais cela ne fait pas grand chose pour me dire pourquoi c’est le cas. Si je comprends bien les spécifications SQL, ” n’est pas la même chose que NULL – l’une est une donnée valide et l’autre indique l’absence de cette même information.

N’hésitez pas à spéculer, mais veuillez indiquer si c’est le cas. S’il y a quelqu’un d’Oracle qui peut le commenter, ce serait fantastique!

Je crois que la réponse est que Oracle est très, très vieux.

Autrefois, avant qu’il y ait un standard SQL, Oracle a décidé que les chaînes vides des colonnes VARCHAR / VARCHAR2 étaient NULL et qu’il n’y avait qu’un seul sens de NULL (il y a des théoriciens relationnels qui différencient les données qui n’ont jamais été demandé, les données où la réponse existe mais n’est pas connue par l’utilisateur, les données où il n’y a pas de réponse, etc., qui constituent tous un sens de NULL ).

Au moment où le standard SQL est apparu 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 un code qui supposait que les deux étaient équivalents. Ainsi, Oracle a été fondamentalement laissé avec les options de briser le code existant, violant le standard SQL, ou introduisant une sorte de paramètre d’initialisation qui changerait la fonctionnalité d’un nombre potentiellement élevé de requêtes. Violer le standard SQL (IMHO) était le moins perturbateur de ces trois options.

Oracle a laissé ouverte la possibilité que le type de données VARCHAR change dans une version ultérieure pour respecter le standard SQL (ce qui explique pourquoi tout le monde utilise VARCHAR2 dans Oracle car le comportement de ce type de données VARCHAR2 ).

Tom Kyte Vice-président d’Oracle:

Une longueur de ZERO varchar est traitée comme NULL.

” n’est pas traité comme NULL.

” lorsqu’il est assigné à un caractère (1) devient ” (les types de caractères sont des chaînes remplies vides).

” lorsqu’il est assigné à un varchar2 (1) devient ” qui est une chaîne de longueur zéro et une chaîne de longueur zéro est NULL dans Oracle (ce n’est pas long ”)

Je pense que cela a beaucoup plus de sens si vous pensez à Oracle comme les développeurs précédents l’ont probablement fait – en tant que backend glorifié pour un système de saisie de données. Chaque champ de la firebase database correspondait à un champ sous une forme qu’un opérateur de saisie de données voyait sur son écran. Si l’opérateur n’a rien saisi dans un champ, que ce soit “date de naissance” ou “adresse”, les données pour ce champ sont “inconnues”. Un opérateur n’a aucun moyen d’indiquer que l’adresse d’une personne est vraiment une chaîne vide, et cela n’a pas vraiment de sens de toute façon.

La documentation Oracle avertit les développeurs de ce problème, au moins jusqu’à la version 7.

Oracle a choisi de représenter NULLS par la technique de la “valeur impossible”. Par exemple, une valeur NULL dans un emplacement numérique sera stockée sous la forme “moins zéro”, une valeur impossible. Tous les zéros qui résultent des calculs seront convertis en zéro positif avant d’être stockés.

Oracle a également choisi, à tort, de considérer la chaîne VARCHAR de longueur zéro (la chaîne vide) comme une valeur impossible et un choix approprié pour représenter NULL. Il s’avère que la chaîne vide est loin d’être une valeur impossible. C’est même l’identité sous l’opération de concaténation de chaîne!

La documentation Oracle avertit les concepteurs de bases de données et les développeurs qu’une future version d’Oracle pourrait rompre cette association entre la chaîne vide et la valeur NULL, et casser tout code dépendant de cette association.

Il existe des techniques pour marquer NULLS autres que des valeurs impossibles, mais Oracle ne les a pas utilisées.

(J’utilise le mot “location” ci-dessus pour désigner l’intersection d’une ligne et d’une colonne.)

Chaîne vide est identique à NULL simplement parce que c’est le “moindre mal” par rapport à la situation où les deux (chaîne vide et null) ne sont pas les mêmes.

Dans les langues où NULL et Ssortingng vide ne sont pas les mêmes, il faut toujours vérifier les deux conditions.

Parce que ne pas le traiter comme NULL n’est pas particulièrement utile non plus.

Si vous faites une erreur dans ce domaine sur Oracle, vous remarquez tout de suite Dans SQL Server, cependant, cela semble fonctionner et le problème n’apparaît que lorsque quelqu’un entre une chaîne vide au lieu de NULL (peut-être d’une bibliothèque cliente .net, où null est différent de “”, mais vous les traitez généralement de la même façon). ).

Je ne dis pas qu’Oracle a raison, mais il me semble que les deux manières sont à peu près également mauvaises.

Selon les documents officiels de 11g

Oracle Database traite actuellement une valeur de caractère avec une longueur de zéro comme nulle. Cependant, cela ne continuera peut-être pas à être vrai dans les versions ultérieures, et Oracle recommande de ne pas traiter les chaînes vides de la même manière que les valeurs NULL.

Raisons possibles

  1. val IS NOT NULL est plus lisible que val != ''
  2. Pas besoin de vérifier les deux conditions val != '' and val IS NOT NULL

Exemple de livre

  set serveroutput on; DECLARE empty_varchar2 VARCHAR2(10) := ''; empty_char CHAR(10) := ''; BEGIN IF empty_varchar2 IS NULL THEN DBMS_OUTPUT.PUT_LINE('empty_varchar2 is NULL'); END IF; IF '' IS NULL THEN DBMS_OUTPUT.PUT_LINE(''''' is NULL'); END IF; IF empty_char IS NULL THEN DBMS_OUTPUT.PUT_LINE('empty_char is NULL'); ELSIF empty_char IS NOT NULL THEN DBMS_OUTPUT.PUT_LINE('empty_char is NOT NULL'); END IF; END; 

En effet, je n’ai eu que des difficultés avec Oracle, y compris des valeurs datetime non valides (ne peuvent pas être imprimées, converties ou rien, simplement regardées avec la fonction DUMP ()) qui peuvent être insérées dans la firebase database. version du client en colonne binary! Voilà pour protéger l’intégrité de la firebase database!

Gestion Oracle des liens NULL:

http://digitalbush.com/2007/10/27/oracle-9i-null-behavior/

http://jeffkemponoracle.com/2006/02/empty-ssortingng-andor-null.html

Tout d’abord, les chaînes null et null n’étaient pas toujours traitées de la même manière par Oracle. Une chaîne vide est, par définition, une chaîne ne contenant aucun caractère. Ce n’est pas du tout la même chose qu’un null. NULL est, par définition, l’absence de données.

Il y a cinq ou six ans, la chaîne vide était traitée différemment de null par Oracle. Alors que, comme null, la chaîne NULL était égale à tout et différente de tout (ce qui est correct pour null, mais totalement WRONG pour une chaîne nulle), au moins la longueur (chaîne NULL) renverrait 0, car une chaîne de longueur nulle.

Actuellement, dans Oracle, length (null) renvoie null, ce qui est correct, mais length (chaîne vide) renvoie également null, ce qui est totalement incorrect.

Je ne comprends pas pourquoi ils ont décidé de commencer à traiter ces 2 “valeurs” distinctes de la même manière. Ils signifient différentes choses et le programmeur doit pouvoir agir sur chacun de différentes manières. Le fait qu’ils aient changé de méthodologie me dit qu’ils ne savent pas vraiment comment traiter ces valeurs.