Sua expressão é:
where varCharColumn in (-1, '')
A lista deve ter tipos consistentes. O primeiro elemento diz "esta é uma lista de inteiros", então o segundo valor é convertido em um inteiro. E
''
torna-se 0
. Na verdade, qualquer string alfanumérica que comece com um não dígito também é convertida em
0
para uma comparação inteira. Então, você tem essa situação 'A' in (0) --> TRUE
'B' in (0) --> TRUE
'A' in ('B') --> FALSE
Você pode testar isso facilmente com:
select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');
Você pode vê-lo em ação com uma coluna:
select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t
Isso retorna verdadeiro, falso, verdadeiro. No entanto, observe que
val in (-1, 'B')
retorna FALSE neste caso. O MySQL está tratando a string vazia de forma diferente de uma string real, talvez de forma inconsistente com a documentação. Que isso é verdade com colunas é exibido por:
select val in (0)
from (select 'A' as val) t;
Quem disse que a lógica não pode ser divertida?
Para corrigir isso, faça com que a lista seja de tipos consistentes, provavelmente colocando aspas simples nos números.