par Guillaume Lelarge.

NULL dans la base de données Oracle


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

          qu'est-ce qui est NULL ?
----------------------------
0 n'est pas NULL
'' EST 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 VARCHAR2. 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.

Contenu

  1. NULL dans les index — Chaque index est un index partiel

  2. Contraintes NOT NULL — affecte l'utilisation des index

  3. Émuler des index partiels — utiliser une indexation basée sur les fonctions

Section précédenteSection suivante

À propos de l'auteur

Photo de Markus Winand

Markus Winand teaches efficient SQL—inhouse and online. He minimizes the development time using modern SQL and optimizes the runtime with smart indexing—for that he also published the book SQL Performance Explained.

“Use The Index, Luke!” by Markus Winand and translated by Guillaume Lelarge is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Mentions légales | Contact | NO WARRANTY | Marque déposée | Privacy | CC-BY-NC-ND 3.0 license