Durant une formation, on s’est retrouvé face à une particularité assez fine de MySQL, alors qu’on cherchait à tester PDO en PHP.

Voici la requête préparée qu’on avait mise au point :

SELECT nom, prenom
FROM auteur
WHERE nom = ?;

En lieu et place du nom, nous avons voulu insérer un zéro

Cela donnait donc

SELECT nom, prenom
FROM auteur
WHERE nom = 0;

En ce cas, MySQL transtype tous les noms de champs en entier, de la même manière que PHP, à savoir :
‘abc’ donne 0
‘3 euros’ donne 3

Dans cette requête, le WHERE comporte une égalité, donc MySQL transtype les membres de l’égalité pour la réaliser. Il transtype donc le champ nom en entier, et notre requête devient :

SELECT nom, prenom
FROM auteur
WHERE 0 = 0;

Mais ce qui est encore plus fort, c’est d’utiliser FALSE. Le SQL comprend FALSE comme valeur, mais lors d’une requête, le même transtypage, évoqué ci-dessus, s’opère et FALSE devient 0 en tant qu’entier.

Donc la requête

SELECT nom, prenom
FROM auteur
WHERE nom = FALSE;

renvoie les mêmes résultats que celle déjà citée avec le WHERE 0=0

Etonnant, non ?


Leave a Comment