Изразът ви е:
where varCharColumn in (-1, '')
Списъкът трябва да има последователни типове. Първият елемент казва "това е списък с цели числа", така че втората стойност се преобразува в цяло число. И ''
става 0
.
Всъщност всеки буквено-цифров низ, който започва с нецифрено число, също се преобразува в 0
за целочислено сравнение. И така, имате тази ситуация
'A' in (0) --> TRUE
'B' in (0) --> TRUE
'A' in ('B') --> FALSE
Можете лесно да тествате това с:
select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');
Можете да го видите в действие с колона:
select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t
Това връща true, false, true. Обърнете внимание обаче, че val in (-1, 'B')
връща FALSE в този случай. MySQL третира празния низ по различен начин от реалния низ, може би в противоречие с документацията.
Че това е вярно с колоните е показано от:
select val in (0)
from (select 'A' as val) t;
Кой каза, че логиката не може да бъде забавна?
За да коригирате това, направете списъка да бъде от последователни типове, вероятно като поставите единични кавички около числата.