Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Kết quả không mong muốn của MySQL:Mệnh đề IN (số, 'chuỗi') trên cột varchar

Biểu hiện của bạn là:

where varCharColumn in (-1, '')

Danh sách phải có các loại nhất quán. Phần tử đầu tiên cho biết "đây là danh sách các số nguyên", vì vậy giá trị thứ hai được chuyển đổi thành số nguyên. Và '' trở thành 0 .

Trên thực tế, bất kỳ chuỗi chữ và số nào bắt đầu bằng một chữ số khác cũng được chuyển đổi thành 0 để so sánh số nguyên. Vì vậy, bạn gặp trường hợp này

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

Bạn có thể dễ dàng kiểm tra điều này với:

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

Bạn có thể thấy nó hoạt động với một cột:

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

Điều này trả về true, false, true. Tuy nhiên, lưu ý rằng val in (-1, 'B') trả về FALSE trong trường hợp này. MySQL đang xử lý chuỗi trống khác với chuỗi thực, có lẽ không nhất quán với tài liệu.

Điều này đúng với các cột được trưng bày bởi:

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

Ai nói logic không thể vui?

Để khắc phục điều này, hãy đặt tất cả danh sách có các loại nhất quán, có thể bằng cách đặt các dấu ngoặc kép xung quanh các số.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ứng dụng danh sách việc cần làm sử dụng cơ sở dữ liệu PHP và MySQL

  2. # 1071 - Khóa được chỉ định quá dài; độ dài khóa tối đa là 1000 byte

  3. Cách dễ nhất để trích xuất ngày bắt đầu và ngày kết thúc nước rút từ db JIRA là gì?

  4. Sự khác biệt giữa việc sử dụng INDEX và KEY trong MySQL là gì?

  5. Kết quả Nhóm MySQL theo ngày sử dụng dấu thời gian