Oracle hat mehrere Zeichendatentypen, die häufig verwendet werden und auch verwirrend sein können, wenn Sie die Unterschiede zwischen ihnen nicht kennen. In diesem Artikel erfahren Sie, um welche Typen es sich handelt und worin sie sich unterscheiden.
Die am häufigsten verwendeten Oracle-Zeichendatentypen sind CHAR und VARCHAR2. Es gibt auch einen VARCHAR-Datentyp.
Lassen Sie uns sehen, was jeder dieser Datentypen ist.
CHAR Datentyp
Der CHAR-Datentyp speichert Zeichenwerte. Er speichert diese Werte als Zeichenkette mit fester Länge.
Das bedeutet, dass Zeichenkettenwerte aufgefüllt oder mit Leerzeichen versehen werden, damit sie in der Datenbank gespeichert werden können.
Die maximale Länge eines CHAR-Wertes beträgt 2000 Bytes.
Sehen wir uns ein Beispiel dafür an.
Ich erstelle eine Beispieltabelle, die alle drei Datentypen verwendet, füge einige Daten ein und schaue, was sie anzeigt.
CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));
Nun fügen wir einen Wert ein.
INSERT INTO chartest (char_column)VALUES ('abcde');
Nun fragen wir den Wert ab. Ich werde den Wert und den Wert innerhalb der Klammern abfragen (um zu sehen, wo Leerzeichen sind), die Länge überprüfen und dann einen DUMP durchführen, um einige Statistiken zu sehen.
SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;
Ergebnis:
CHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
abcde | (abcde ) | 10 | Typ=96 Len=10: 97,98,99,100,101,32,32,32,32,32 |
Wie Sie sehen, wurde der Wert von abcde beim Speichern mit Leerzeichen aufgefüllt, um eine Länge von 10 zu erreichen. In der Ausgabe der Funktion DUMP können Sie die Codes für jedes gespeicherte Zeichen sehen. Zeichen 32 ist ein Leerzeichen.
VARCHAR-Datentyp
Der VARCHAR-Datentyp ist ein ANSI-Standard-Datentyp, weshalb er in Oracle enthalten ist.
Allerdings ist er im Moment derselbe wie der VARCHAR2-Datentyp.
Er wurde in Oracle aufgenommen, um eine Unterscheidung zwischen NULL und leeren Zeichenketten zu ermöglichen, was VARCHAR nach dem ANSI-Standard tun sollte. In Oracle ist dies jedoch nicht der Fall. Er funktioniert wie ein VARCHAR2, bei dem leere Zeichenfolgen als NULL-Werte behandelt werden.
In Oracle gibt es also keinen Unterschied zwischen VARCHAR und VARCHAR2. Sie sind identisch.
Sie sollten den VARCHAR-Datentyp nicht verwenden, da er für künftige Oracle-Funktionen reserviert ist und sich diese ändern könnten.
Lassen Sie uns ein Beispiel sehen. Wir verwenden die gleiche Tabelle wie zuvor und fügen einige Daten ein.
INSERT INTO chartest (varchar_column)VALUES ('fghij');
Wählen wir nun diese Daten aus.
SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;
Ergebnis:
VARCHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
fghij | (fghij) | 5 | Typ=1 Len=5: 102,103,104,105,106 |
Sie sehen, dass der Wert in Klammern keine Leerzeichen enthält, weil VARCHAR2 und VARCHAR keine Leerzeichen hinzufügen (was ich gleich erläutern werde). Außerdem hat er eine Länge von 5 Zeichen.
Datentyp VARCHAR2
Der Datentyp VARCHAR2 wird zum Speichern von Zeichenketten variabler Länge verwendet. Das bedeutet, dass Sie eine maximale Größe definieren und die Zeichenfolgen, die Sie in die Spalte einfügen, so gespeichert werden, wie sie angegeben sind. Dem Zeichen werden keine Leerzeichen hinzugefügt, wie beim Datentyp CHAR.
Die maximale Länge eines VARCHAR2-Datentyps beträgt 4000 Bytes. Diese wurde jedoch als eines der neuen Features in Oracle 12c auf 32.767 Bytes erhöht.
Lassen Sie uns ein Beispiel sehen.
INSERT INTO chartest (varchar2_column)VALUES ('klmno');
Nun lassen Sie uns das Ergebnis abfragen.
SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;
Result:
VARCHAR2_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
klmno | (klmno) | 5 | Typ=1 Len=5: 107,108,109,110,111 |
Sie sehen, dass die Ausgabe die gleiche ist wie im VARCHAR-Beispiel. Es wurden keine Leerzeichen hinzugefügt, und die Länge ist die gleiche. Der einzige Unterschied sind die ASCII-Code-Zeichen, da die Eingabezeichenfolge anders war.
Unterschiede: CHAR vs VARCHAR vs VARCHAR2
Werfen wir einen Blick auf die Unterschiede zwischen diesen drei Datentypen.
- VARCHAR und VARCHAR2 sind genau gleich. CHAR ist anders.
- CHAR hat eine maximale Größe von 2000 Bytes, und VARCHAR/VARCHAR2 hat eine maximale Größe von 4000 Bytes (oder 32.767 in Oracle 12c)
- CHAR muss keine Größe angegeben werden und hat einen Standardwert von 1. Bei VARCHAR/VARCHAR2-Spalten muss eine Größe angegeben werden.
- CHAR füllt Leerzeichen rechts von Strings auf, um die Länge der Spalte anzupassen, während VARCHAR/VARCHAR2 dies nicht tut.
Die Leistung von CHAR, VARCHAR und VARCHAR2 ist gleich. Bei diesen Datentypen gibt es keinen Unterschied in der Leistung. CHAR ist nicht schneller als VARCHAR2 und VARCHAR2 ist nicht schneller als CHAR.
Tom Kyte hat einen Beitrag auf AskTom, in dem er die technischen Details dazu erläutert. Er erklärt auch, dass ein mit Leerzeichen aufgefüllter VARCHAR2-Wert genau dasselbe ist wie ein CHAR-Wert.
Denken Sie einen Moment darüber nach.
Ein mit Leerzeichen aufgefüllter VARCHAR2-Wert ist dasselbe wie ein CHAR-Wert.
Die Datentypen sind fast identisch.
Welchen dieser Datentypen sollte man also verwenden?
Wie Tom Kyte in seinem Forum und in seinem Buch erörtert hat (und ich stimme ihm zu), gibt es keinen Grund, jemals den Datentyp CHAR zu verwenden. VARCHAR2 kann alle Situationen abdecken, in denen ein CHAR in Frage kommt – sogar ein CHAR(1), der dasselbe ist wie ein VARCHAR2(1).
VARCHAR vs. VARCHAR2
Der Unterschied zwischen VARCHAR und VARCHAR2 in Oracle besteht darin, dass VARCHAR ein ANSI-Standard-Datentyp ist, der eine Unterscheidung zwischen NULL und leeren Zeichenfolgen unterstützt. Oracle hat diese Unterscheidung noch nicht implementiert, so dass im Moment VARCHAR und VARCHAR2 gleich sind. Es ist sicherer, VARCHAR2 zu verwenden, da Sie nicht wollen, dass Ihr Code kaputt geht, wenn Oracle VARCHAR in Zukunft ändert und Ihr Code VARCHAR verwendet.