Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Nieoczekiwane wyniki MySQL:klauzula IN (liczba, „ciąg”) w kolumnie varchar

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ruby On Rails działa wolno...?

  2. Dlaczego liczność indeksu w MySQL pozostaje niezmieniona po dodaniu nowego indeksu?

  3. Podziel wartość z jednego pola na dwa

  4. Laravel dołącza do 3 stołów

  5. Zapis DataFrame do tabeli mysql za pomocą pySpark