Ihr Ausdruck ist:
where varCharColumn in (-1, '')
Die Liste muss konsistente Typen haben. Das erste Element sagt "Dies ist eine Liste von Ganzzahlen", also wird der zweite Wert in eine Ganzzahl umgewandelt. Und ''
wird zu 0
.
Tatsächlich wird jede alphanumerische Zeichenfolge, die mit einer Nichtziffer beginnt, ebenfalls in 0
konvertiert für einen ganzzahligen Vergleich. Sie haben also diese Situation
'A' in (0) --> TRUE
'B' in (0) --> TRUE
'A' in ('B') --> FALSE
Sie können dies leicht testen mit:
select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');
Sie können es in Aktion mit einer Spalte sehen:
select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t
Dies gibt wahr, falsch, wahr zurück. Beachten Sie jedoch, dass val in (-1, 'B')
gibt in diesem Fall FALSE zurück. MySQL behandelt den leeren String anders als einen echten String, möglicherweise widerspricht es der Dokumentation.
Dass dies bei Spalten zutrifft, zeigt:
select val in (0)
from (select 'A' as val) t;
Wer hat gesagt, dass Logik keinen Spaß machen kann?
Um dies zu beheben, machen Sie die Liste alle konsistent, indem Sie die Zahlen wahrscheinlich in einfache Anführungszeichen setzen.