6 votes

La comparaison d'une chaîne de caractères avec un champ numérique renvoie des résultats inattendus

Étant donné le tableau :

CREATE TABLE IF NOT EXISTS `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Ajoutez quelques rangs :

INSERT INTO `users` (`id`,`name`) VALUES (NULL , 'Bob'),(NULL , 'Larry'),(NULL , 'Steve');

Pourquoi, OH WHY ! cette requête renvoie des résultats :

SELECT * FROM `users` WHERE id = "2this-is-not a numeric value"

Résultat :

query returned 1 row(s) in 0.0003 sec
id  name
-----------------
2   Larry

La chaîne de caractères utilisée dans la clause where est clairement convertie en valeur numérique -- qui a dit de faire cela ? ! Je ne trouve aucune documentation suggérant que mysql ou PHP ait la prétention de convertir automatiquement ma chaîne littérale.

Cela ne fonctionne que si le caractère numérique est le premier de la chaîne, "this 2 is not numeric" ne renvoie pas de résultats. "12 2" deviendrait 12 , "1 2" (un-espace-deux) devient 1 .

Tout article ou documentation expliquant ce comportement serait apprécié.

10voto

Scott Saunders Points 12721

C'est dans la documentation MySQL ici : http://dev.mysql.com/doc/refman/5.1/en/type-conversion.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X