Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Resultados inesperados do MySQL:cláusula IN (número, 'string') em uma coluna varchar


Sua expressão é:
where varCharColumn in (-1, '')

A lista deve ter tipos consistentes. O primeiro elemento diz "esta é uma lista de inteiros", então o segundo valor é convertido em um inteiro. E '' torna-se 0 .

Na verdade, qualquer string alfanumérica que comece com um não dígito também é convertida em 0 para uma comparação inteira. Então, você tem essa situação
'A' in (0)   --> TRUE
'B' in (0)   --> TRUE
'A' in ('B') --> FALSE

Você pode testar isso facilmente com:
select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');

Você pode vê-lo em ação com uma coluna:
select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t

Isso retorna verdadeiro, falso, verdadeiro. No entanto, observe que val in (-1, 'B') retorna FALSE neste caso. O MySQL está tratando a string vazia de forma diferente de uma string real, talvez de forma inconsistente com a documentação.

Que isso é verdade com colunas é exibido por:
select val in (0)
from (select 'A' as val) t;

Quem disse que a lógica não pode ser divertida?

Para corrigir isso, faça com que a lista seja de tipos consistentes, provavelmente colocando aspas simples nos números.