Der Unterschied zwischen CHAR, VARCHAR und VARCHAR2

Oracle hat drei Datentypen zum Speichern von Zeichenketten. – CHAR, VARCHAR und VARCHAR2. Wie unterscheiden sie sich voneinander? Wann sollte man welchen verwenden?

Lassen Sie uns die Antworten in diesem Artikel herausfinden.

Das Einfachste zuerst aus dem Weg: VARCHAR und VARCHAR2 sind das Gleiche. Aber das ist heute so – das kann sich ändern. Werfen Sie einen Blick in die Oracle-Dokumentation 10G Release 2:

Verwenden Sie nicht den Datentyp VARCHAR. Verwenden Sie stattdessen den Datentyp VARCHAR2. Obwohl der Datentyp VARCHAR derzeit synonym mit VARCHAR2 ist, ist geplant, den Datentyp VARCHAR als separaten Datentyp neu zu definieren, der für Zeichenketten mit variabler Länge und unterschiedlicher Vergleichssemantik verwendet wird.

In diesem Artikel wird VARCHAR2 verwendet, um sowohl VARCHAR als auch VARCHAR2 zu meinen, da sie heute gleichwertig sind.

Wie unterscheiden sich CHAR und VARCHAR2 dann?

Der Unterschied ist, dass CHAR(n) IMMER n Bytes lang ist. Wenn die Zeichenfolge <n lang ist, wird sie beim Einfügen mit Leerzeichen aufgefüllt, um eine Länge von n zu gewährleisten. Ein VARCHAR2(n) hingegen ist 1 bis n Byte lang. Eine kürzere Zeichenfolge, die als VARCHAR2 gespeichert wird, wird NICHT aufgefüllt.

Angenommen, Sie speichern die Zeichenfolge „ORATABLE“ in einem CHAR(20)-Feld und einem VARCHAR2(20)-Feld. Das CHAR-Feld wird 22 Bytes (2 Bytes für die führende Länge) verwenden. Das VARCHAR2-Feld verwendet nur 10 Bytes (8 für die Zeichenkette, 2 Bytes für die führende Länge).

Zusammenfassend lässt sich sagen, dass CHAR VARCHAR2 auf seine maximale Länge aufgefüllt wird.

Wie wirkt sich dieser Unterschied auf SQLs aus?

Dies ändert die Art und Weise, wie Zeichenketten in CHAR vs. VARCHAR2 zugeordnet werden. Schauen Sie es sich in Aktion an:

SQL> create table strings 2 (colchar char (20) 3 , colvarchar varchar2 (20));Table created.SQL>SQL> insert into strings 2 (colchar, colvarchar) 3 values 4 ('ORATABLE', 'ORATABLE');1 row created.SQL> -- Define a string variableSQL> var str varchar2(20)SQL> -- Give it a value with length < 20SQL> exec :str := 'ORATABLE'PL/SQL procedure successfully completed.SQL> -- Exact string match with CHARSQL> -- No result found!SQL> select 'found' found_flag 2 from strings 3 where colchar = :str;no rows selectedSQL> -- Padded string match with CHARSQL> -- Now it finds itSQL> select 'found' found_flag 2 from strings 3 where colchar = rpad(:str,20);FOUND-----found

Sie sehen also, dass das Auffüllen mit Leerzeichen einen Unterschied macht, ob die CHAR-Zeichenfolge mit einem Parameter variabler Länge abgeglichen wird. Um eine Übereinstimmung zu erzielen, müssen Sie entweder den Wert rpad oder die Spalte rtrim auffüllen.

Bei VARCHAR2 gibt es keine solche Anforderung:

SQL> -- Exact string match with VARCHAR2SQL> -- Result found!SQL> select 'found' found_flag 2 from strings 3 where colvarchar = :str;FOUND-----found

Wann sollte man CHAR verwenden, wann VARCHAR2?

Wenn Sie nur VARCHAR2 verwenden und CHAR ignorieren, machen Sie sich das Leben viel einfacher. Es gibt keinen Unterschied zwischen den beiden, außer dass CHAR mehr Platz verbraucht, wenn Ihre Zeichenketten nicht immer die festgelegte Höchstlänge haben. Außerdem führt CHAR beim Schreiben von Abfragen zu mehr Verwirrung.

Ich verwende CHAR als Datenbankspalten nur für Werte vom Typ J/N. (Es gibt keinen BOOLEAN-Spalten-Datentyp, erinnern Sie sich?) Dies wirkt wie eine Markierung für einen „Flag“- oder „Switch“-Typ von Spalten – aber es hätte genauso gut VARCHAR2 sein können.

Für alle anderen Zeichenfolgen ist es VARCHAR2.

Zusammenfassung

Wenn Sie die Oracle-Datentypen CHAR, VARCHAR und VARCHAR2 betrachten, denken Sie daran, dass:

  • VARCHAR und VARCHAR2 gleich sind, aber die Funktion von VARCHAR sich in Zukunft ändern könnte. Verwenden Sie VARCHAR2.
  • CHAR und VARCHAR2 unterscheiden sich darin, dass CHAR seine Zeichenketten mit Leerzeichen auffüllt, um die maximale Länge zu erreichen. VARCHAR2 füllt keine Leerzeichen auf.
  • Aus diesem Grund müssen Abfragen, die einen String-Vergleich mit einer CHAR-Spalte beinhalten, sorgfältiger durchgeführt werden – ein VARCHAR2 im Vergleich zu CHAR muss rpad-ded werden, um einen Treffer zu erzielen.
  • Es muss wiederholt werden: Verwenden Sie VARCHAR2!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.