Het probleem is of je char . gebruikt of varchar2 vergelijkingssemantiek in uw zoekopdrachten. Als je een hardgecodeerde letterlijke tekenreeks of een char(10) . hebt variabele, Oracle gebruikt de char vergelijkingssemantiek die de volgende witruimte moet negeren. Als je een varchar2(10) . hebt variabele, Oracle gebruikt de varchar2 vergelijkingssemantiek die de volgende witruimte omvat. Dus
select aa
into v_temp
from abc
where aa in (v_aa);
zal een rij retourneren als v_aa is gedefinieerd als een char(10) (of als het wordt vervangen door een letterlijke tekenreeks) maar niet als het is gedefinieerd als een varchar(10) .
Dit is een van de (vele) redenen waarom de meeste mensen char vermijden gegevenstypen volledig. Persoonlijk vind ik het af en toe een char niet erg voor data met echt vaste breedte (d.w.z. char(1) voor vlaggen en char(2) voor staatscodes), hoewel het geen voordeel heeft om char . te gebruiken via varchar2 in die scenario's. Voor alles dat geen vaste breedte heeft, gebruikt u echter een char slaat nergens op. Je dwingt Oracle alleen maar meer ruimte in te nemen dan nodig is en je creëert meer werk voor jezelf met twee sets stringvergelijkingssemantiek (onder andere).