Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Unerwartete MySQL-Ergebnisse:IN-Klausel (Zahl, 'String') in einer varchar-Spalte

Ihr Ausdruck ist:

where varCharColumn in (-1, '')

Die Liste muss konsistente Typen haben. Das erste Element sagt "Dies ist eine Liste von Ganzzahlen", also wird der zweite Wert in eine Ganzzahl umgewandelt. Und '' wird zu 0 .

Tatsächlich wird jede alphanumerische Zeichenfolge, die mit einer Nichtziffer beginnt, ebenfalls in 0 konvertiert für einen ganzzahligen Vergleich. Sie haben also diese Situation

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

Sie können dies leicht testen mit:

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

Sie können es in Aktion mit einer Spalte sehen:

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

Dies gibt wahr, falsch, wahr zurück. Beachten Sie jedoch, dass val in (-1, 'B') gibt in diesem Fall FALSE zurück. MySQL behandelt den leeren String anders als einen echten String, möglicherweise widerspricht es der Dokumentation.

Dass dies bei Spalten zutrifft, zeigt:

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

Wer hat gesagt, dass Logik keinen Spaß machen kann?

Um dies zu beheben, machen Sie die Liste alle konsistent, indem Sie die Zahlen wahrscheinlich in einfache Anführungszeichen setzen.