Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Abfragespalte mit char-Datentyp in Oracle

Das Problem hängt davon ab, ob Sie char verwenden oder varchar2 Vergleichssemantik in Ihren Abfragen. Wenn Sie ein hartcodiertes Zeichenfolgenliteral oder ein char(10) haben Variable verwendet Oracle den char Vergleichssemantik, die den nachgestellten Leerraum ignorieren soll. Wenn Sie einen varchar2(10) haben Variable verwendet Oracle die varchar2 Vergleichssemantik, die den abschließenden Leerraum enthält. Also

 select aa 
   into v_temp 
   from abc 
  where aa in (v_aa);

gibt eine Zeile zurück, wenn v_aa ist als char(10) definiert (oder wenn es durch ein Zeichenfolgenliteral ersetzt wird), aber nicht, wenn es als varchar(10) definiert ist .

Dies ist einer der (vielen) Gründe, warum die meisten Menschen char vermeiden Datentypen vollständig. Persönlich stört mich das gelegentliche char nicht für Daten mit wirklich fester Breite (d. h. char(1) für Flags und char(2) für Bundesstaatscodes), obwohl die Verwendung von char keinen Vorteil bringt über varchar2 in diesen Szenarien. Verwenden Sie für alles, was keine feste Breite hat, jedoch ein char macht keinen Sinn. Sie zwingen Oracle nur, mehr Speicherplatz zu verbrauchen, als es benötigt, und schaffen sich selbst mehr Arbeit, wenn Sie sich (neben anderen Problemen) mit zwei Sätzen von Zeichenfolgenvergleichssemantiken befassen.