Les NULL
en SQL sont une source fréquente de confusion.
Bien que l'idée de base d'un NULL
(représenter une valeur
manquante) soit assez simple, cela donne lieu à quelques
spécificités. Par exemple, vous devez utiliser IS NULL
à la
place de = NULL
. De plus, la base de données Oracle a
certains comportements étranges avec NULL
, tout d'abord parce
qu'elle ne gère pas toujours NULL
comme le spécifie le
standard, mais aussi parce qu'elle a une gestion très « spéciale » de
NULL
dans les index.
Le standard SQL ne définit pas NULL
comme une valeur
mais plutôt comme un marqueur pour une valeur manquante ou inconnue. En
conséquence, aucune valeur ne peut être NULL
. Étonnement, la
base de données Oracle traite les chaînes de caractères vides comme des
NULL
:
SELECT '0 EST NULL???' AS "qu'est-ce qui est NULL ?" FROM dual
WHERE 0 IS NULL
UNION ALL
SELECT '0 n''est pas NULL' FROM dual
WHERE 0 IS NOT NULL
UNION ALL
SELECT ''''' EST NULL???' FROM dual
WHERE '' IS NULL
UNION ALL
SELECT ''''' n''est pas null' FROM dual
WHERE '' IS NOT NULL
Pour ajouter à la confusion, il existe même un cas où la base de
données Oracle traite NULL
comme une chaîne de caractères
vide :
SELECT dummy
, dummy || ''
, dummy || NULL
FROM dual
D D D
- - -
X X X
Concaténer la colonne DUMMY
(contenant toujours
'X'
) avec NULL
devrait renvoyer
NULL
.
Le concept du NULL
est utilisé dans un grand nombre de
langages de programmation. Peu importe où vous regardez, une chaîne de
caractères vide n'est jamais NULL
… sauf dans la base de
données Oracle. En fait, il est impossible d'enregistrer une chaîne vide
dans un champ VARCHAR
. Si vous essayez, la base de données
Oracle enregistre à la base un NULL
.
Cette spécificité n'est pas seulement étrange, elle est aussi
dangereuse. De plus, le comportement bizarre de la base de données Oracle
avec les NULL
ne s'arrête pas là. Il continue avec
l'indexation.