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.