sql >> Databasteknik >  >> RDS >> Mysql

MySQL oväntade resultat:IN-klausul (nummer, 'sträng') på en varchar-kolumn

Ditt uttryck är:

where varCharColumn in (-1, '')

Listan måste ha konsekventa typer. Det första elementet säger "detta är en lista med heltal", så det andra värdet konverteras till ett heltal. Och '' blir 0 .

Faktum är att alla alfanumeriska strängar som börjar med en icke-siffra också konverteras till 0 för en heltalsjämförelse. Så du har den här situationen

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

Du kan enkelt testa detta 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 kolumn:

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

Detta returnerar sant, falskt, sant. Observera dock att val in (-1, 'B') returnerar FALSK i detta fall. MySQL behandlar den tomma strängen annorlunda än en riktig sträng, kanske inkonsekvent med dokumentationen.

Att detta är sant med kolumner visas av:

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

Vem har sagt att logik inte kan vara kul?

För att åtgärda detta, gör listan helt konsekvent, förmodligen genom att sätta enstaka citattecken runt siffrorna.



  1. Laravel | Unik validering där klausul

  2. Hur ansluter man MySQL-databas med Python+SQLAlchemy på distans?

  3. Jämföra databasproxyfeltider - ProxySQL, MaxScale och HAProxy

  4. Hur man hittar en tabell med en specifik kolumn i postgresql