Je uitdrukking is:
where varCharColumn in (-1, '')
De lijst moet consistente typen hebben. Het eerste element zegt "dit is een lijst met gehele getallen", dus de tweede waarde wordt geconverteerd naar een geheel getal. En ''
wordt 0
.
In feite wordt elke alfanumerieke tekenreeks die begint met een niet-cijfer ook geconverteerd naar 0
voor een geheeltallige vergelijking. Dus je hebt deze situatie
'A' in (0) --> TRUE
'B' in (0) --> TRUE
'A' in ('B') --> FALSE
U kunt dit gemakkelijk testen met:
select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');
Je kunt het in actie zien met een kolom:
select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t
Dit retourneert waar, onwaar, waar. Houd er echter rekening mee dat val in (-1, 'B')
geeft in dit geval FALSE terug. MySQL behandelt de lege string anders dan een echte string, misschien in strijd met de documentatie.
Dat dit geldt voor kolommen blijkt uit:
select val in (0)
from (select 'A' as val) t;
Wie zei dat logica niet leuk kan zijn?
Om dit op te lossen, moet u ervoor zorgen dat de lijst allemaal van een consistent type is, waarschijnlijk door enkele aanhalingstekens rond de getallen te plaatsen.