Was ist der Unterschied zwischen den Oracle-Datentypen VARCHAR und VARCHAR2?

Antworten:

26

Es scheint, dass Oracle zu einer Zeit Pläne hatte, VARCHAR anders zu definieren als VARCHAR2 . Es hat Kunden dies mitgeteilt und rät von der Verwendung von VARCHAR ab . Was auch immer ihre Pläne waren, ab 11.2.0.2 ist VARCHAR identisch mit VARCHAR2 . In der SQL-Sprachreferenz 11g Release 2 heißt es:

Verwenden Sie nicht den Datentyp VARCHAR. Verwenden Sie stattdessen den Datentyp VARCHAR2. Obwohl der VARCHAR-Datentyp derzeit gleichbedeutend mit VARCHAR2 ist, soll der VARCHAR-Datentyp als separater Datentyp für Zeichenfolgen variabler Länge im Vergleich zu verschiedenen Vergleichssemantiken neu definiert werden.

In PL / SQL-Benutzerhandbuch und Referenz 10g Release 2 heißt es folgendermaßen:

Derzeit ist VARCHAR ein Synonym für VARCHAR2. In zukünftigen Versionen von PL / SQL wird VARCHAR möglicherweise ein separater Datentyp mit unterschiedlicher Vergleichssemantik, um den neuen SQL-Standards gerecht zu werden. Es ist eine gute Idee, VARCHAR2 anstelle von VARCHAR zu verwenden.

In dem Dokument zu Database Concepts 10g Release 2 heißt es in genaueren Worten:

Der VARCHAR-Datentyp ist gleichbedeutend mit dem VARCHAR2-Datentyp. Verwenden Sie zum Speichern von Zeichenfolgen variabler Länge immer den Datentyp VARCHAR2, um mögliche Verhaltensänderungen zu vermeiden.

In der Dokumentation zu Oracle 9.2 und 8.1.7 wird im Wesentlichen dasselbe gesagt, und obwohl Oracle von der Verwendung von VARCHAR immer wieder abgeraten wird , haben sie bisher nichts unternommen, um die Parität mit VARCHAR2 zu ändern .

Leigh Riffel
quelle
Ich erinnere mich an varchar2 in Oracle 8i, bin mir aber nicht sicher, ob es sich damals auch um einen varchar handelte.
bernd_k
Es gibt Hinweise darauf, dass die Definition vor 8i abweichend gewesen sein könnte.
Leigh Riffel
Früher dachte ich, es gäbe eine andere Längenbeschränkung als varcharvor Version 8, aber ich kann nichts Seriöses finden, um dies zu belegen, und jetzt frage ich mich, ob es nur ein Mythos ist.
Jack Douglas
@ Jack Douglas - Ich kann in der Oracle 7-Dokumentation nichts dazu finden. Von docs.oracle.com/cd/A57673_01/DOC/dcommon/oin/indexj.htm >> Oracle 7 Server >> Serverkonzepte >> Oracle-Datentypen (können nicht direkt darauf verlinken) sagen so ziemlich das Gleiche wie später Versionen. In einem anderen Abschnitt der Dokumentation zu Version 7 heißt es, dass Varchar und Varchar2 in Version 6 Synonyme für char waren.
Leigh Riffel
25

Derzeit sind die beiden synonym.

VARCHAR ist ein ANSI-Standarddatentyp, aber die Oracle-Implementierung des VARCHAR-Datentyps verstößt gegen den ANSI-Standard, indem die leere Zeichenfolge als NULL betrachtet wird (die Oracle-Implementierung geht dem ANSI-Standard voraus). Wie Leigh betont, hat Oracle angegeben, dass sich die Semantik des Datentyps VARCHAR in Bezug auf die Behandlung der leeren Zeichenfolge in Zukunft möglicherweise ändert. In diesem Fall bleibt die Semantik des Datentyps VARCHAR2 unverändert. Die Verwendung des Datentyps VARCHAR2 ist sicherer, da Sie sich keine Sorgen machen müssen, dass eine zukünftige Version von Oracle Ihren Code beschädigt, da leere Zeichenfolgen nicht mehr als NULL betrachtet werden.

Justin Cave
quelle
3

Denn im ursprünglichen SQL-Standard bestand ein VARCHAR aus 255 Zeichen, und Oracle hatte zu dieser Zeit zumindest ein Problem mit der Einhaltung von Standards.

Gaius
quelle
Das gibt Hoffnung, Oracle varchar3 (max) in einigen Jahren zu sehen.
bernd_k
SQL-Server hatte keine Probleme, die zulässige Länge von 255 auf 8000 (und jetzt sogar auf max) zu erhöhen. Warum brauchte Oracle einen anderen Datentyp?
bernd_k
1
Es besteht keine Notwendigkeit für a varchar(max), verwenden Sie einfach aCLOB
a_horse_with_no_name
3
CLOB hat eine andere Semantik als VARCHAR2
Gaius