sql >> Database teknologi >  >> RDS >> Mysql

MySQL Uventede resultater:IN-klausul (nummer, 'streng') på en varchar-kolonne

Dit udtryk er:

where varCharColumn in (-1, '')

Listen skal have ensartede typer. Det første element siger "dette er en liste over heltal", så den anden værdi konverteres til et heltal. Og '' bliver 0 .

Faktisk konverteres enhver alfanumerisk streng, der starter med et ikke-ciffer, også til 0 for en heltalssammenligning. Så du har denne situation

'A' in (0)   --> TRUE
'B' in (0)   --> TRUE
'A' in ('B') --> FALSE

Du kan nemt teste dette med:

select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');

Du kan se det i aktion med en kolonne:

select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t

Dette returnerer sandt, falsk, sandt. Bemærk dog, at val in (-1, 'B') returnerer FALSK i dette tilfælde. MySQL behandler den tomme streng anderledes end en rigtig streng, måske ikke i overensstemmelse med dokumentationen.

At dette er sandt med kolonner, udstilles af:

select val in (0)
from (select 'A' as val) t;

Hvem sagde, at logik ikke kan være sjovt?

For at rette op på dette skal du gøre listen af ​​ensartede typer, sandsynligvis ved at sætte enkelte anførselstegn rundt om tallene.



  1. Gemmer du HABTM med ekstra felter?

  2. DateTime grupper efter dato og time

  3. MySQL - Betinget COUNT med GROUP BY

  4. MySql Single Table, Vælg de sidste 7 dage og medtag tomme rækker