Problemet kommer ned til, om du bruger char
eller varchar2
sammenligningssemantik i dine forespørgsler. Hvis du har en hårdkodet streng literal eller en char(10)
variabel, Oracle bruger char
sammenligningssemantik, som skal ignorere det efterfølgende hvide rum. Hvis du har en varchar2(10)
variabel, Oracle bruger varchar2
sammenligningssemantik, som inkluderer det efterfølgende hvide mellemrum. Således
select aa
into v_temp
from abc
where aa in (v_aa);
returnerer en række hvis v_aa
er defineret som en char(10)
(eller hvis det er erstattet med en streng literal), men ikke hvis det er defineret som en varchar(10)
.
Dette er en af de (mange) grunde til, at de fleste mennesker undgår char
datatyper helt. Personligt har jeg ikke noget imod den lejlighedsvise char
for data med virkelig fast bredde (dvs. char(1)
for flag og char(2)
for statskoder), selvom der ikke er nogen fordel ved at bruge char
over varchar2
i de scenarier. For alt, der ikke er fast bredde, dog ved at bruge en char
giver ingen mening. Du tvinger bare Oracle til at forbruge mere plads, end det behøver, og skaber mere arbejde til dig selv ved at håndtere to sæt strengsammenligningssemantik (blandt andre problemer).