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ố.