Ditt uttryck är:
where varCharColumn in (-1, '')
Listan måste ha konsekventa typer. Det första elementet säger "detta är en lista med heltal", så det andra värdet konverteras till ett heltal. Och ''
blir 0
.
Faktum är att alla alfanumeriska strängar som börjar med en icke-siffra också konverteras till 0
för en heltalsjämförelse. Så du har den här situationen
'A' in (0) --> TRUE
'B' in (0) --> TRUE
'A' in ('B') --> FALSE
Du kan enkelt testa detta med:
select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');
Du kan se det i aktion med en kolumn:
select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t
Detta returnerar sant, falskt, sant. Observera dock att val in (-1, 'B')
returnerar FALSK i detta fall. MySQL behandlar den tomma strängen annorlunda än en riktig sträng, kanske inkonsekvent med dokumentationen.
Att detta är sant med kolumner visas av:
select val in (0)
from (select 'A' as val) t;
Vem har sagt att logik inte kan vara kul?
För att åtgärda detta, gör listan helt konsekvent, förmodligen genom att sätta enstaka citattecken runt siffrorna.