18.14 Problèmes avec la valeur NULL

Le concept de valeur NULL est une source intarrissable d'erreur pour les néophytes de SQL, qui pensent souvent que NULL est équivalent à la chaîne vide ''. Ceci est totalement faux! Par exemple, les deux commandes suivantes sont complètement différentes :

mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ("");

Les deux exemples insèrent une valeur dans la colonne phone, mais le premier insère la valeur NULL et le second insère la chaîne vide. La première commande peut être considéré comme ``numéro de téléphone inconnu'' et le deuxième signifiant : ``elle n'a pas de téléphone''.

En SQL, la valeur NULL est toujours fausse lors des comparaisons avec une autre valeur, même avec elle même. Une expression qui contient NULL retournera toujours NULL à moins que cela ne soit indiqué dans la documentation des opérateurs et fonction mises en jeu. Toutes les colonnes suivantes retourneront NULL:

mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);

Si vous voulez rechercher des colonnes qui contiennent des valeurs NULL, vous ne pourrez pas utiliser le test =NULL. La commande suivant retournera toujours 0 lignes, car expr = NULL est TOUJOURS fausse, pour toute expression:

mysql> SELECT * FROM my_table WHERE phone = NULL;

Pour rechercher des valeurs NULL, vous devez utiliser le test IS NULL. Les exemples suivants montrent comment rechercher les valeurs NULL dans la colonne du numéro de téléphone :

mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = "";

Avec MySQL, comme pour de nombreux serveurs SQL, vous ne pouvez pas indexer des colonnes qui contiennent des valeurs NULL. Vous devez impérativement déclarer les colonnes comme NOT NULL. Par conséquent, il ne sera pas possible d'insérer une valeur NULL dans une colonne indexée.

Lorsque vous chargez une table avec LOAD DATA INFILE, les colonnes vides seront remplies par ''. Si vous voulez insérer une valeur NULL dans une colonne, vous devrez utiliser la séquence \N dans le fichier texte. Le mot 'NULL' ne peut être utilisé que dans certaines circonstances. Reportez vous à la section LOAD DATA.

Lorsque vous utiliser une clause ORDER BY, les valeurs NULL apparaîtront en premier. Si vous triez dans l'ordre descendant (DESC), NULL seront placées en dernier. Avec les clauses GROUP BY, toutes les valeurs NULL sont considérées comme égales.

Pour faciliter la manipulation des valeurs NULL, vous disposez des opérateurs IS NULL et IS NOT NULL et de la fonction IFNULL().

Pour certains types de colonnes, NULL est géré de manière particulière. Si vous insérez NULL dans la première colonne de type TIMESTAMP d'une table, la date courante sera insérée. Si vous insérez NULL dans une colonne AUTO_INCREMENT, le numéro suivant sera inséré.