あなたの表現は:
where varCharColumn in (-1, '')
リストには一貫したタイプが必要です。最初の要素は「これは整数のリストです」と言っているので、2番目の値は整数に変換されます。そして''
0
になります 。
実際、数字以外で始まる英数字の文字列も0
に変換されます。 整数比較用。だから、あなたはこの状況にあります
'A' in (0) --> TRUE
'B' in (0) --> TRUE
'A' in ('B') --> FALSE
これは次の方法で簡単にテストできます:
select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');
コラムで実際の動作を確認できます:
select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t
これはtrue、false、trueを返します。ただし、val in (-1, 'B')
この場合、FALSEを返します。 MySQLは、空の文字列を実際の文字列とは異なる方法で処理しています。おそらくドキュメントと矛盾しています。
これが列に当てはまるということは、次の人によって示されています:
select val in (0)
from (select 'A' as val) t;
論理は面白くないと誰が言ったのですか?
これを修正するには、リストをすべて一貫したタイプにする必要があります。おそらく、数字を一重引用符で囲みます。