Vấn đề nằm ở việc bạn có sử dụng char
hay không hoặc varchar2
ngữ nghĩa so sánh trong các truy vấn của bạn. Nếu bạn có một chuỗi được mã hóa cứng là ký tự hoặc char(10)
biến, Oracle sử dụng char
ngữ nghĩa so sánh là bỏ qua khoảng trắng ở cuối. Nếu bạn có varchar2(10)
biến, Oracle sử dụng varchar2
ngữ nghĩa so sánh bao gồm khoảng trắng ở cuối. Như vậy
select aa
into v_temp
from abc
where aa in (v_aa);
sẽ trả về một hàng nếu v_aa
được định nghĩa là một char(10)
(hoặc nếu nó được thay thế bằng một chuỗi ký tự) nhưng không phải nếu nó được định nghĩa là varchar(10)
.
Đây là một trong (nhiều) lý do mà hầu hết mọi người tránh char
các kiểu dữ liệu hoàn toàn. Cá nhân tôi không bận tâm về char
không thường xuyên cho dữ liệu có độ rộng cố định thực sự (tức là char(1)
cho cờ và char(2)
đối với mã tiểu bang) mặc dù không có lợi khi sử dụng char
qua varchar2
trong các tình huống đó. Tuy nhiên, đối với bất kỳ thứ gì không có chiều rộng cố định, sử dụng char
không có ý nghĩa. Bạn chỉ đang buộc Oracle sử dụng nhiều dung lượng hơn mức cần thiết và tạo ra nhiều công việc hơn cho chính bạn để giải quyết hai bộ ngữ nghĩa so sánh chuỗi (trong số các vấn đề khác).