2010-12-07 7 views
1

Version MySQL 5.0.67Bogue MySQL? Sélectionnez WHERE id = '1blah'

Jetez un oeil à ce tableau très simple et dites-moi si j'ai trouvé un bug MySQL, j'ai essayé de chercher une réponse mais comme vous pouvez l'imaginer il est un peu difficile de trouver les termes de recherche

CREATE TABLE `product` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(60) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

INSERT INTO `product` VALUES (1, 'jim'); 
INSERT INTO `product` VALUES (2, 'bob'); 

de là, je peux alors choisir le

SELECT * FROM `product` WHERE `id` = '1'; 

suivante Évidemment, cela renvoie une ligne, mais, est-ce donc ce

SELECT * FROM `product` WHERE `id` = '1blah'; 

Erm ... POURQUOI? C'est sûrement faux ou je deviens fou? Va explorer un peu plus le web avant de déposer un rapport de bug avec MySQL.

Répondre

1

Ceci est dû à la conversion de type. Puisque votre colonne a une valeur entière, '1blah' est converti en 1. Veuillez voir http://dev.mysql.com/doc/refman/5.0/en/type-conversion.html pour plus de détails.

+0

Ah ça explique ça, d'accord maintenant pour savoir comment l'arrêter, je ne veux pas ça :) Je pense que BINARY() peut être le chemin – Catharsis

+1

@Catharsis - Ce n'est pas ce que BINARY est pour. Indépendamment, vous devriez vraiment corriger ceci dans votre code de construction de requête SQL, pas dans la requête elle-même. –

+2

@Catharsis: vous pourriez utiliser 'CAST (id comme TEXT)', mais vous perdriez alors la possibilité d'utiliser l'index sur 'id' dans la requête. –

5

Il convertit automatiquement la chaîne "1blah" en entier. Comme la chaîne commence par un "1" l'entier résultant est simplement 1.

En tant que tel, il essaie juste de faire la bonne chose, même si cela peut sembler un peu contre-intuitif.

0

Si vous ne mettez pas l'ID entre guillemets, cela fonctionnera et vous obtiendrez une erreur comme vous l'espériez. C'est,

SELECT * FROM `product` WHERE `id` = 1; 

1 row in set 

œuvres, tandis que

SELECT * FROM `product` WHERE `id` = 1blah; 

ERROR 1054 (42S22): Unknown column '1blah' in 'where clause' 

erreurs.

+0

Vraiment, je pourrais avoir à mettre quelque chose dans ma classe PHP pour m'assurer que seules les chaînes soient cotées – Catharsis

+0

@Catharsis - Si cela provient d'une classe PHP personnalisée, assurez-vous d'utiliser mysql_real_escape_string pour toutes les variables. –

+0

Yep déjà fait, mais merci pour l'avertissement – Catharsis