Váš výraz je:
where varCharColumn in (-1, '')
Seznam musí mít konzistentní typy. První prvek říká „toto je seznam celých čísel“, takže druhá hodnota je převedena na celé číslo. A ''
se změní na 0
.
Ve skutečnosti je každý alfanumerický řetězec, který začíná jinou než číslicí, převeden na 0
pro celočíselné srovnání. Takže máte tuto situaci
'A' in (0) --> TRUE
'B' in (0) --> TRUE
'A' in ('B') --> FALSE
Můžete to snadno otestovat pomocí:
select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');
Můžete to vidět v akci se sloupcem:
select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t
Toto vrátí true, false, true. Pamatujte však, že val in (-1, 'B')
v tomto případě vrací FALSE. MySQL zachází s prázdným řetězcem jinak než se skutečným řetězcem, možná v rozporu s dokumentací.
Že to platí se sloupci, ukazuje:
select val in (0)
from (select 'A' as val) t;
Kdo řekl, že logika nemůže být zábavná?
Chcete-li tento problém vyřešit, vytvořte seznam konzistentních typů, pravděpodobně tím, že čísla umístíte do jednoduchých uvozovek.