Masalahnya adalah apakah Anda menggunakan char
atau varchar2
perbandingan semantik dalam kueri Anda. Jika Anda memiliki string literal hard-coded atau char(10)
variabel, Oracle menggunakan char
perbandingan semantik yang mengabaikan spasi putih. Jika Anda memiliki varchar2(10)
variabel, Oracle menggunakan varchar2
perbandingan semantik yang mencakup spasi tambahan. Jadi
select aa
into v_temp
from abc
where aa in (v_aa);
akan mengembalikan baris jika v_aa
didefinisikan sebagai char(10)
(atau jika diganti dengan string literal) tetapi tidak jika didefinisikan sebagai varchar(10)
.
Ini adalah salah satu (banyak) alasan mengapa kebanyakan orang menghindari char
tipe data sepenuhnya. Secara pribadi, saya tidak keberatan dengan char
untuk data dengan lebar yang benar-benar tetap (yaitu char(1)
untuk flag dan char(2)
untuk kode negara) meskipun tidak ada gunanya menggunakan char
lebih dari varchar2
dalam skenario tersebut. Namun, untuk apa pun yang tidak memiliki lebar tetap, gunakan char
tidak masuk akal. Anda hanya memaksa Oracle untuk menggunakan lebih banyak ruang daripada yang dibutuhkan dan menciptakan lebih banyak pekerjaan untuk Anda sendiri yang berurusan dengan dua set semantik perbandingan string (di antara masalah lainnya).