Tu expresión es:
where varCharColumn in (-1, '')
La lista debe tener tipos consistentes. El primer elemento dice "esta es una lista de números enteros", por lo que el segundo valor se convierte en un número entero. Y ''
se convierte en 0
.
De hecho, cualquier cadena alfanumérica que comience con un dígito que no sea también se convierte a 0
para una comparación de enteros. Entonces, tienes esta situación
'A' in (0) --> TRUE
'B' in (0) --> TRUE
'A' in ('B') --> FALSE
Puede probar esto fácilmente con:
select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');
Puedes verlo en acción con una columna:
select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t
Esto devuelve verdadero, falso, verdadero. Sin embargo, tenga en cuenta que val in (-1, 'B')
devuelve FALSO en este caso. MySQL está tratando la cadena vacía de manera diferente a una cadena real, quizás de manera inconsistente con la documentación.
Que esto es cierto con las columnas lo demuestra:
select val in (0)
from (select 'A' as val) t;
¿Quién dijo que la lógica no puede ser divertida?
Para arreglar esto, haga que la lista sea de tipos consistentes, probablemente colocando comillas simples alrededor de los números.