Mysql
 sql >> Base de données >  >> RDS >> Mysql

Résultats inattendus MySQL :clause IN (nombre, 'chaîne') sur une colonne varchar

Votre expression est :

where varCharColumn in (-1, '')

La liste doit avoir des types cohérents. Le premier élément dit "ceci est une liste d'entiers", donc la deuxième valeur est convertie en entier. Et '' devient 0 .

En fait, toute chaîne alphanumérique commençant par un non-chiffre est également convertie en 0 pour une comparaison entière. Donc, vous avez cette situation

'A' in (0)   --> TRUE
'B' in (0)   --> TRUE
'A' in ('B') --> FALSE

Vous pouvez facilement tester cela avec :

select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');

Vous pouvez le voir en action avec une colonne :

select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t

Cela renvoie vrai, faux, vrai. Cependant, notez que val in (-1, 'B') renvoie FALSE dans ce cas. MySQL traite la chaîne vide différemment d'une chaîne réelle, peut-être de manière incohérente avec la documentation.

Que cela soit vrai avec les colonnes est démontré par :

select val in (0)
from (select 'A' as val) t;

Qui a dit que la logique ne pouvait pas être amusante ?

Pour résoudre ce problème, faites en sorte que la liste soit de types cohérents, probablement en mettant des guillemets simples autour des nombres.