Unterschied zwischen CHAR, VARCHAR und VARCHAR2

In Oracle existieren drei Datentypen für die Speicherung der Zeichenketten – CHAR, VARCHAR und VARCHAR2. Jeder der sich zum ersten mal mit der Oracle Datenbank auseinader setzen möchte, wird sich mit sicherheit fragen, was der Unterschied zwischen den Datentypen ist und in welchem Fall welches Datentyp verwendet werden sollte. In diesem Beitrag möchte ich auf diese Fragen genauer eingehen und versuche die Unterschiede mit anhand der Code Beispiele deutlich zu machen.

VARCHAR vs. VARCHAR2

Als ersten kann man bereits jetzt anmerken, dass VARCHAR und VARCHAR2 bis Oracle 12c Release 1, also Stand heute, das gleiche ist. Jedoch kann dies in Zukunft ändern, den in der Oracle Doku steht folgendes zum Datentyp VARCHAR

Do not use the VARCHAR data type. Use the VARCHAR2 data type instead. Although the VARCHAR data type is currently synonymous with VARCHAR2, the VARCHAR data type is scheduled to be redefined as a separate data type used for variable-length character strings compared with different comparison semantics.

Aus diesem Grund, werde ich in diesem und auch folgenden Beitragen immer Datentyp VARCHAR2 statt VARCHAR.

CHAR vs. VARCHAR2

Eigentlich ist CHAR auch das gleiche wie VARCHAR2, mit einem kleinen Unterschied.
Der Unterschied ist, dass der Datentyp CHAR im Gegensatz zu VARCHAR2 immer eine feste Anzahl an Bytes speichert. CHAR(n) ist somit immer n Byte gross, wenn der String weniger Bytes enthält wird es bis zu nBytes mit Leerzeichen gefühlt. VARCHAR2(n) wird 1 bis nByte gross. Kurze Zeichenketten werden nicht mit Leerzeichen gefüllt.

Angenommen wir wollen die Zeichenkette „Hallo Welt“ in einem CHAR(15) und VARCHAR2(15) speichern. Für das CHAR(15) Feld werden 15 Bytes im Speicher allokiert. Das VARCHAR2 Feld werden nur die tatsächlichen 10 Byte im Speicher allokiert.

Zusammenfassend kann man sagen, dass CHAR ein, um seine Länge gefüllter, VARCHAR2 ist.

Wie sieht es in der Praxis aus?

Schauen wir uns den Unterschied auf einem praktischen Beispiel an.

Als erstes lege ich eine Tabelle mit zwei Spalten, 1 vom Typ CHAR und die andere vom Typ VARCHAR2

Jetzt lege ich einen Datensatz an mit der Zeichenkette „Hallo Welt“ in beiden Spalten an.

Der Versuch, den Datensatz über die Spalte mit dem Datentyp CHAR zu finden, endet mit „no rows selected„. Wird das Select über die VARCHAR2 Spalte abgesetzt, so liefert es das gewünschte Ergebnis.

Das gewünschte Ergebnis liefert auch folgendes Select zurück. Hier wird die Zeichenkette mit Hilfe von RPAD von der rechten Seite mit Leerzeichen bis zur einer Länge von 15 Bytes gepaddet.

Und hier ist die Erklärung dafür:

Wann setzt man CHAR, und wann VARCHAR2 ein

Es wird das Leben einfacher, wenn immer VARCHAR2 zum Einsatz kommt. Es gibt keinen Unterschied zwischen den beiden, was das Verwenden von CHAR unbedingt nötig macht.
Das bestätigt auch Tom Kyte in seinem Buch „Expert Oracle Database Architecture„. Er empfiehlt immer VARCHAR2 zu benutzen.

Ich muss aber gestehen, dass ich in meinen Projekten CHAR in einigen Fällen verwende. Der erste Fall ist, wenn die Spalte eine feste Breite hat, wie z.B bei ISO Codes. Der zweite Fall ist, wenn ich eine Boolean Spalte haben möchte (In Oracle SQL gibt es kein Datentyp Boolean). Man kann aber auch in diesen Fällen VARCHAR2 verwenden.

Zusammenfassung

  • VARCHAR und VARCHAR2 ist zur Zeit das selbe. VARCHAR kann in Zukunft aber für andere Zwecke verwendet werden! Benutze VARCHAR2!
  • VARCHAR2 kann für Zeichenketten variabler Länge verwendet werden
  • Wenn CHAR, dann sollte es nur für Zeichenketten fester Länge verwendet werden
  • Verwende VARCHAR2!!!

Kommentar verfassen