Valeur NULL et chaîne vide

Remarque

Les tables utilisées sont disponibles en téléchargement [ZIP]. Vous pouvez les récupérer pour les importer dans votre compte individuel sur phpMyAdmin et expérimenter vous-même avec le comportement des valeurs NULL et des chaînes vides.

Il est possible de définir certains champs afin qu'ils acceptent les valeurs NULL (données absentes) – par ex. pour les champs facultatifs. De plus, les champs de type texte ont aussi la particularité de pouvoir contenir des chaînes vides (données qui n'existent pas). « Valeur NULL » et « chaîne vide » sont deux réalités différentes qu'il est important de bien distinguer, en particulier parce qu'elles ont des comportements différents au niveau de la recherche.

Valeur NULL : définition et comportement en recherche

Soit la table suivante qui contient entre autres le champ VALEUR qui accepte les valeurs NULL (champ facultatif) :

Contenu de la table demo_NULL

NO

VALEUR

EXPLICATION

1

valeur enregistrement 1

enregistrement 1 avec valeur

2

NULL

enregistrement 2 NULL

3

valeur enregistrement 3

enregistrement 3 avec valeur

La chose importante à retenir d'une valeur NULL est que ce n'est pas une chaîne de caractères ce qui entraîne des comportements particuliers avec certains opérateurs de comparaison. C'est le cas de l'opérateur « = » qui sert à vérifier si une chaîne de caractères est égale à un certain contenu textuel. Par exemple, la requête ci-dessous permet d'identifier les enregistrements dont le champ « explication » contient exactement « enregistrement 1 avec valeur » :

1
SELECT *
2
FROM demo_NULL
3
WHERE explication = 'enregistrement 1 avec une valeur';
Table des résultats

NO

VALEUR

EXPLICATION

1

valeur enregistrement 1

enregistrement 1 avec valeur

Le mot-clé ici à retenir est que cet opérateur compare des chaînes de caractères. Or, une valeur NULL n'étant pas une chaîne de caractères, l'utilisation de « = » avec une valeur NULL ne retournera jamais rien (la condition sera toujours fausse). Par exemple, la requête SQL ci-dessous ne repère aucun enregistrement :

1
SELECT *
2
FROM demo_NULL
3
WHERE valeur = NULL;

Il faut donc faire très attention si on veut repérer des champs ayant une valeur NULL, un besoin légitime dans bien des contextes, à ne pas utiliser l'opérateur « = ». L'opérateur à utiliser en ce cas est « IS » :

1
SELECT *
2
FROM demo_NULL
3
WHERE valeur IS NULL;
Table des résultats

NO

VALEUR

EXPLICATION

2

NULL

enregistrement 2 NULL

Si ce que l'on désire repérer est l'inverse, soit les champs dont la valeur n'est pas NULL, vous pouvez utiliser l'opérateur « IS NOT » :

1
SELECT *
2
FROM demo_NULL
3
WHERE valeur IS NOT NULL;
Table des résultats

NO

VALEUR

EXPLICATION

1

valeur enregistrement 1

enregistrement 1 avec valeur

3

valeur enregistrement 3

enregistrement 3 avec valeur

Il est aussi possible d'appliquer la négation (NOT) à l'ensemble de la comparaison ainsi : WHERE NOT (valeur IS NULL).

La fonction ISNULL peut aussi être utilisée pour repérer les valeurs NULL : WHERE ISNULL(valeur).

Il y a donc plusieurs manières équivalentes pour repérer les valeurs NULL ou les valeurs non NULL. L'important est d'éviter la seule qui ne fonctionne pas (l'opérateur « = » ainsi que son « opposé » « <> »)!

En sus de l'opérateur « = » qu'il faut éviter avec les valeurs NULL, il faut savoir que les opérateurs « < », « <= », « > » et « >= » utilisés avec des chaînes de caractères pour repérer des valeurs plus petites ou plus grandes que certains contenus, ne fonctionneront pas non plus avec des valeurs NULL. Une valeur NULL n'étant pas une chaîne de caractères, elle n'est ni plus petite (ni plus grande) qu'une chaîne de caractères. Ainsi, bien qu'on puisse à première vue s'attendre à ce que la requête ci-dessous repère tous les enregistrements, ce n'est pas le cas. Les enregistrements dont le champ « valeur » est NULL ne sont pas repérés comme la valeur NULL de l'enregistrement 2 n'est ni « <"A" », ni « >= "A" » comme ce n'est pas une chaîne de caractères :

1
SELECT *
2
FROM demo_NULL
3
WHERE valeur < "A"
4
OR valeur >= "A";
Table des résultats

NO

VALEUR

EXPLICATION

1

valeur enregistrement 1

enregistrement 1 avec valeur

3

valeur enregistrement 3

enregistrement 3 avec valeur

Valeur NULL versus Chaîne vide

Pour les champs textuels, en sus de pouvoir accepter ou non les valeurs NULL, on peut aussi retrouver des chaînes vides. La distinction entre la signification d'une valeur NULL dans un champ et d'une chaîne vide est subtile :

  • La valeur NULL signifie que la valeur est absente (c'est-à-dire non saisie pour différentes raisons comme, par exemple, un oubli ou par manque de temps).

  • La chaîne vide, quant à elle, correspond à une valeur qui n'existe pas (par exemple, un champ « plaque d'immatriculation » pour une personne n'ayant aucun véhicule motorisé).

Par exemple, imaginons un champ « cellulaire » contenant le numéro de téléphone cellulaire des employés d'une organisation et les deux cas suivants :

  • John Smith, n'aimant pas donner ses informations personnelles sans raison valable, ne veut pas donner son numéro de cellulaire qui ne sert que pour des fins privées.

  • Son voisin de cubicule, Adams Apple, est un réfractaire notoire à l'utilisation des cellulaires pour des raisons écologiques et n'en possède donc pas.

Dans un cas comme dans l'autre, il n'y aura pas de numéro de cellulaire dans la base de données pour ces deux individus mais pour des raisons très différentes. Pour le premier, c'est une donnée absente; pour le deuxième, une donnée qui n'existe pas.

S'il est important, pour les besoins de l'organisation, de pouvoir distinguer ces deux cas, il faut donc prévoir pour ce champ à la fois la possibilité de valeurs NULL (cas de John Smith) et de chaînes vides (cas d'Adams Apple). Des requêtes SQL pourraient ainsi repérer l'un ou l'autre des cas. Par contre, il faut s'assurer que les personnes responsables de la saisie comprennent bien la différence et fassent la saisie en conséquence; de même pour les personnes qui feront l'interrogation de la base de données.

Chaîne vide : comportement en recherche

Soit la table suivante qui contient un champ de type texte qui permet les chaînes vides (valeur) :

Contenu de la table demo_VIDE

NO

VALEUR

EXPLICATION

1

valeur enregistrement 1

enregistrement 1 avec valeur

2

enregistrement 2 VIDE

3

valeur enregistrement 3

enregistrement 3 avec valeur

La bonne nouvelle concernant la chaîne vide est qu'en tant que chaîne de caractères, elle se comporte donc « normalement » avec les différents opérateurs dans les requêtes SQL (« = », « < », « <= », « > », « >= »). Une chaîne vide, à la fois à la saisie et dans les requêtes, est représentée par deux guillemets simples qui se suivent ('') ou deux guillemets doubles qui se suivent (""). Pour identifier les champs avec des chaînes vides, on procède donc ainsi :

1
SELECT *
2
FROM demo_VIDE
3
WHERE valeur = '';

ou

1
SELECT *
2
FROM demo_VIDE
3
WHERE valeur = "";
Table des résultats

NO

VALEUR

EXPLICATION

2

enregistrement 2 VIDE

Une chaîne vide étant une chaîne de longueur 0, elle se trouve ainsi être plus petite que toutes les chaînes de longueur 1 et plus. Par exemple :

1
SELECT *
2
FROM demo_VIDE
3
WHERE valeur < 'A';
Table des résultats

NO

VALEUR

EXPLICATION

2

enregistrement 2 VIDE

Ainsi, la requête ci-dessous repérera cette fois toutes les notices comme, pour tous les enregistrements, le champ « valeur » contient des chaînes de caractères!

1
SELECT *
2
FROM demo_VIDE
3
WHERE valeur < "A"
4
OR valeur >= "A";
Table des résultats

NO

VALEUR

EXPLICATION

1

valeur enregistrement 1

enregistrement 1 avec valeur

2

enregistrement 2 VIDE

3

valeur enregistrement 3

enregistrement 3 avec valeur