Ekspresi Anda adalah:
where varCharColumn in (-1, '')
Daftar harus memiliki tipe yang konsisten. Elemen pertama mengatakan "ini adalah daftar bilangan bulat", jadi nilai kedua diubah menjadi bilangan bulat. Dan ''
menjadi 0
.
Faktanya, setiap string alfanumerik yang dimulai dengan non-digit juga dikonversi menjadi 0
untuk perbandingan bilangan bulat. Jadi, Anda memiliki situasi ini
'A' in (0) --> TRUE
'B' in (0) --> TRUE
'A' in ('B') --> FALSE
Anda dapat dengan mudah menguji ini dengan:
select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');
Anda dapat melihatnya beraksi dengan kolom:
select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t
Ini mengembalikan true, false, true. Namun, perhatikan bahwa val in (-1, 'B')
mengembalikan FALSE dalam kasus ini. MySQL memperlakukan string kosong secara berbeda dari string asli, mungkin tidak konsisten dengan dokumentasi.
Bahwa ini benar dengan kolom ditunjukkan oleh:
select val in (0)
from (select 'A' as val) t;
Siapa bilang logika tidak bisa menyenangkan?
Untuk memperbaikinya, buat daftar menjadi tipe yang konsisten, mungkin dengan menempatkan tanda kutip tunggal di sekitar angka.