Twoje wyrażenie to:
where varCharColumn in (-1, '')
Lista musi mieć spójne typy. Pierwszy element mówi „to jest lista liczb całkowitych”, więc druga wartość jest konwertowana na liczbę całkowitą. I ''
staje się 0
.
W rzeczywistości każdy ciąg alfanumeryczny rozpoczynający się od cyfry innej niż cyfra jest również konwertowany na 0
dla porównania liczb całkowitych. A więc masz taką sytuację
'A' in (0) --> TRUE
'B' in (0) --> TRUE
'A' in ('B') --> FALSE
Możesz to łatwo przetestować za pomocą:
select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');
Możesz to zobaczyć w akcji za pomocą kolumny:
select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t
To zwraca prawdę, fałsz, prawdę. Pamiętaj jednak, że val in (-1, 'B')
zwraca FALSE w tym przypadku. MySQL traktuje pusty ciąg inaczej niż prawdziwy ciąg, być może niezgodnie z dokumentacją.
O tym, że tak jest w przypadku kolumn dowodzi:
select val in (0)
from (select 'A' as val) t;
Kto powiedział, że logika nie może być zabawna?
Aby to naprawić, zrób listę spójnych typów, prawdopodobnie umieszczając liczby w pojedynczych cudzysłowach.