Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Hasil Tak Terduga MySQL:IN-klausa (angka, 'string') pada kolom varchar

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Aktivitas terbaru pengguna - PHP MySQL

  2. Berapa ukuran kolom int(11) di mysql dalam byte?

  3. Bagaimana cara mengimpor file .sql di database mysql menggunakan PHP?

  4. Jalankan localhost di mac OS X Yosemite

  5. MySQL - cara menampilkan topik terbaru per utas