211 votes

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

Je sais qu'il ne se considère « » comme NULL , mais cela ne fait pas grand - chose à me dire pourquoi cela est le cas. Comme je comprends 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!

212voto

Justin Cave Points 114578

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

De retour dans les temps anciens, avant il y avait une norme SQL, Oracle a fait la conception de décision que les cordes à vide en VARCHAR/VARCHAR2 de colonnes, NULL et qu'il n'y avait qu'un sens, de la valeur NULL (il y a relationnelle théoriciens qui permettrait de différencier les données qui n'a jamais été invité de, de données où la réponse existe mais n'est pas connu par l'utilisateur, de données où il n'y a pas de réponse, etc. l'ensemble de ce qui constitue le sens de l' NULL).

Par le temps que la norme SQL est venu autour et a convenu qu' NULL et la chaîne vide étaient des entités distinctes, il y avait déjà Oracle utilisateurs qui avaient un code qui suppose les deux sont équivalentes. Si Oracle est fondamentalement de gauche avec les options de casser le code existant, en violation de la norme SQL, ou de l'introduction d'une certaine sorte de l'initialisation du paramètre à modifier les fonctionnalités de potentiellement grand nombre de requêtes. Violation de la norme SQL (à mon humble avis) qui a été le moins perturbateur de ces trois options.

Oracle a laissé ouverte la possibilité que l' VARCHAR type de données serait de changer dans une version future de respecter la norme SQL (c'est pourquoi tout le monde utilise VARCHAR2 dans Oracle depuis que les données de ce type de comportement est assuré de rester le même à l'avenir).

59voto

Brian Points 7072

Tom Kyte vice-président de l'Oracle:

D'une longueur de ZÉRO varchar est traitée comme La valeur NULL.

"n'est pas considérée comme NULLE.

"lorsqu'ils sont affectés à un char(1) devient '' (char types sont vides collier les chaînes).

"lorsqu'ils sont affectés à un varchar2(1) devient " qui est d'une longueur de zéro chaîne et une chaîne de longueur zéro est La valeur NULL dans Oracle (c'est pas long ")

19voto

user67897 Points 171

Je crois que cela fait beaucoup plus de sens si vous pensez que de l'Oracle de la manière la plus tôt les développeurs n'ont probablement -- comme une simple interface pour un système de saisie de données. Chaque champ dans la base de données correspond à un champ dans un formulaire un opérateur de saisie de données vu sur son écran. Si l'opérateur n'a pas à taper quoi que ce soit dans un champ, si c'est "date de naissance" ou "adresse", puis les données de ce champ est "inconnu". Il n'y a aucun moyen pour un opérateur pour indiquer que quelqu'un a l'adresse est vraiment une chaîne vide, et qui n'a pas vraiment beaucoup de sens de toute façon.

18voto

Walter Mitty Points 8726

Documentation Oracle alertes développeurs à ce problème, en remontant au moins jusqu'à la version 7.

Oracle a choisi de représenter les valeurs NULL par le "impossible" valeur technique. Par exemple, une valeur NULL dans un numérique, emplacement sera stocké comme "moins zéro", il est impossible de valeur. Tout au moins les zéros qui sont le résultat de calculs seront convertis en positif zéro avant d'être stockés.

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

Documentation Oracle avertit concepteurs de bases de données et aux développeurs une version future de Oracle pourrait briser cette association entre la chaîne vide et la valeur NULL, et de briser n'importe quel code qui dépend de l'association.

Il existe des techniques pour drapeau NULS autres que impossible valeurs, mais l'Oracle ne pas les utiliser.

(J'utilise le mot "location" ci-dessus pour signifier l'intersection d'une ligne et d'une colonne.)

2voto

Alex Kreutznaer Points 673

La chaîne vide est la même que 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 langages où NULL et String vide ne sont pas identiques, il faut toujours vérifier les deux conditions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X