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

Was ist der Hauptunterschied zwischen Varchar2 und char

Obwohl es bereits mehrere Antworten gibt, die das Verhalten von char korrekt beschreiben , ich denke, es muss gesagt werden, dass Sie es nicht verwenden sollten außer in drei spezifischen Situationen:

  1. Sie erstellen eine Datei oder einen Bericht fester Länge und weisen einem char einen Wert ungleich Null zu vermeidet die Notwendigkeit, ein rpad() zu codieren Ausdruck. Wenn beispielsweise firstname und lastname sind beide als char(20) definiert , dann firstname || lastname ist eine kürzere Schreibweise für rpad(firstname,20) || rpad(lastname,20) um Chuck Norris zu erstellen .
  2. Sie müssen zwischen der expliziten Leerzeichenfolge '' unterscheiden und null . Normalerweise sind sie in Oracle dasselbe, weisen aber '' zu zu einem char value löst sein Verhalten zum Auffüllen mit Leerzeichen aus, während null nicht, also wenn es wichtig ist, den Unterschied zu erkennen, und ich kann mir nicht wirklich einen Grund vorstellen, warum es so wäre, dann haben Sie eine Möglichkeit, das zu tun.
  3. Ihr Code wird von einem anderen System portiert (oder muss mit diesem kompatibel sein), das aus Legacy-Gründen Leerzeichen erfordert. In diesem Fall bleiben Sie dabei und haben mein Mitgefühl.

Es gibt wirklich keinen Grund, char zu verwenden nur weil eine bestimmte Länge festgelegt ist (z. B. ein Y/N Flag oder ein ISO-Währungscode wie 'USD' ). Es ist nicht effizienter, es spart keinen Platz (es gibt keinen mythischen Längenindikator für ein varchar2 , gibt es nur einen Leerzeichen-Overhead für char ) und hält niemanden davon ab, kürzere Werte einzugeben. (Wenn Sie 'ZZ' eingeben in Ihrem char(3) Währungsspalte, wird sie einfach als 'ZZ ' gespeichert .) Es ist nicht einmal abwärtskompatibel mit einer alten Version von Oracle, die sich früher darauf verlassen hat, weil es nie eine gab.

Und die Ansteckung kann sich ausbreiten, da Sie (gemäß Best Practice) eine Variablendeklaration mit etwas wie sales.currency%type verankern könnten . Jetzt Ihre l_sale_currency Variable ist ein Stealth-char die für kürzere Werte unsichtbar mit Leerzeichen aufgefüllt werden (oder '' ) und öffnet die Tür, um Fehler zu verschleiern, in denen l_sale_currency ist nicht gleich l_refund_currency obwohl Sie 'ZZ' zugewiesen haben an beide.

Einige argumentieren, dass char(n) (wobei n eine Zeichenlänge ist) gibt an, dass Werte n erwartet werden Zeichen lang, und dies ist eine Form der Selbstdokumentation. Aber wenn Sie es mit einem 3-Zeichen-Format ernst meinen (z. B. ISO-Alpha-3-Ländercodes anstelle von ISO-Alpha-2), würden Sie nicht eine Einschränkung definieren, um die Regel durchzusetzen, anstatt die Entwickler einen Blick darauf werfen zu lassen ein char(3) Datentyp und ziehen ihre eigenen Schlüsse?

CHAR wurde in Oracle 6 eingeführt, da bin ich mir sicher, aus Gründen der ANSI-Kompatibilität. Wahrscheinlich gibt es potenzielle Kunden, die entscheiden, welches Datenbankprodukt sie kaufen und ANSI-Kompatibilität auf ihrer Checkliste steht (oder war damals) und CHAR with blank-padding ist im ANSI-Standard definiert, also muss Oracle es bereitstellen. Sie sollten es eigentlich nicht verwenden.