Antworten:
Im Moment sind sie Synonyme.
VARCHAR
ist vorbehalten Oracle
, um die Unterscheidung zwischen NULL
und leeren Zeichenfolgen in Zukunft zu unterstützen, wie dies ANSI
standardmäßig vorgeschrieben ist.
VARCHAR2
unterscheidet nicht zwischen einer NULL
und einer leeren Zeichenfolge und wird es niemals tun.
Wenn Sie sich auf leere Zeichenfolgen verlassen und NULL
dasselbe sind, sollten Sie verwenden VARCHAR2
.
VARCHAR2
weil es derzeit keinen Typ gibt, der sich so verhält, wie er VARCHAR
sollte. In der Tat sollten Sie überhaupt nicht verwenden, VARCHAR
bis es richtig implementiert ist.
where x is NULL
Erträge unterschiedliche Ergebnisse aus where x = ''
nicht nicht bedeuten , dass NULL
und ''
sind in keiner Weise anders. Das unterschiedliche Verhalten ist auf den =
Bediener zurückzuführen.
Derzeit verhält sich VARCHAR genauso wie VARCHAR2. Der Typ VARCHAR
sollte jedoch nicht verwendet werden, da er für die zukünftige Verwendung reserviert ist.
Entnommen aus: Unterschied zwischen CHAR, VARCHAR, VARCHAR2
VARCHAR
sollte nicht verwendet werden. Ich habe es bearbeitet
Entnommen aus der neuesten stabilen Oracle-Produktionsversion 12.2: Datentypen
Der Hauptunterschied besteht darin, dass VARCHAR2
es sich um einen internen und VARCHAR
einen externen Datentyp handelt . Wir müssen also den Unterschied zwischen einem internen und einem externen Datentyp verstehen ...
Innerhalb einer Datenbank werden Werte in Spalten in Tabellen gespeichert. Intern repräsentiert Oracle Daten in bestimmten Formaten, die als interne Datentypen bezeichnet werden .
Im Allgemeinen funktionieren OCI-Anwendungen (Oracle Call Interface) nicht mit internen Datentypdarstellungen von Daten, sondern mit Datentypen in der Hostsprache, die durch die Sprache vordefiniert sind, in der sie geschrieben wurden. Wenn Daten zwischen einer OCI-Clientanwendung und einer Datenbanktabelle übertragen werden, konvertieren die OCI-Bibliotheken die Daten zwischen internen Datentypen und externen Datentypen.
Externe Typen bieten dem Programmierer Komfort, indem sie die Arbeit mit Host-Sprachtypen anstelle proprietärer Datenformate ermöglichen. OCI kann beim Übertragen von Daten zwischen einer Oracle-Datenbank und einer OCI-Anwendung eine Vielzahl von Datentypkonvertierungen durchführen. Es gibt mehr externe OCI-Datentypen als interne Oracle-Datentypen.
Der VARCHAR2
Datentyp ist eine Zeichenfolge variabler Länge mit einer maximalen Länge von 4000 Byte. Wenn der init.ora-Parameter max_string_size standardmäßig ist, kann die maximale Länge von a VARCHAR2
4000 Byte betragen . Wenn der init.ora-Parameter max_string_size = erweitert ist, kann die maximale Länge von a VARCHAR2
32767 Byte betragen
Der VARCHAR
Datentyp speichert Zeichenfolgen unterschiedlicher Länge. Die ersten 2 Bytes enthalten die Länge der Zeichenfolge und die verbleibenden Bytes enthalten die Zeichenfolge. Die angegebene Länge der Zeichenfolge in einer Bindung oder einem Definitionsaufruf muss die zwei VARCHAR
Längenbytes enthalten. Die größte Zeichenfolge, die empfangen oder gesendet werden kann, ist also 65533 Byte lang und nicht 65535.
Ein schneller Test in einer 12.2-Datenbank legt nahe, dass Oracle als internen Datentyp a immer noch VARCHAR
als Pseudotyp für behandelt VARCHAR2
. Es ist KEIN SYNONYM
tatsächlicher Objekttyp in Oracle.
SQL> select substr(banner,1,80) from v$version where rownum=1;
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> create table test (my_char varchar(20));
Table created.
SQL> desc test
Name Null? Type
MY_CHAR VARCHAR2(20)
Es gibt auch einige Auswirkungen VARCHAR
auf ProC / C ++ - Precompiler-Optionen. Für interessierte Programmierer befindet sich der Link unter: Pro * C / C ++ - Programmierhandbuch
Nach einigen Experimenten (siehe unten) kann ich bestätigen, dass sich seit September 2017 nichts an der in der akzeptierten Antwort beschriebenen Funktionalität geändert hat : -
NULL
s für beideVARCHAR
undVARCHAR2
.Der historische Grund für diese beiden Schlüsselwörter wird in einer Antwort auf eine andere Frage gut erklärt .
VARCHAR kann bis zu 2000 Byte Zeichen speichern, während VARCHAR2 bis zu 4000 Byte Zeichen speichern kann.
Wenn wir den Datentyp als VARCHAR deklarieren, belegt er Platz für NULL-Werte. Im Fall des Datentyps VARCHAR2 belegt er keinen Platz für NULL-Werte. z.B,
name varchar(10)
reserviert 6 Bytes Speicher, auch wenn der Name 'Ravi__' ist, wohingegen
name varchar2(10)
reserviert Speicherplatz entsprechend der Länge der Eingabezeichenfolge. zB 4 Bytes Speicher für 'Ravi__'.
Hier steht _ für NULL.
HINWEIS: varchar reserviert Platz für Nullwerte und varchar2 reserviert keinen Platz für Nullwerte.
VARCHAR
mit CHAR
.
Derzeit sind sie gleich. aber vorher
VARCHAR
wird von Oracle reserviert, um die Unterscheidung zwischen NULL
und leeren Zeichenfolgen in Zukunft zu unterstützen, wie es der ANSI-Standard vorschreibt.
VARCHAR2
unterscheidet nicht zwischen einer NULL
und einer leeren Zeichenfolge und wird es niemals tun.
Emp_name varchar(10)
- Wenn Sie einen Wert mit weniger als 10 Stellen eingeben, kann der verbleibende Speicherplatz nicht gelöscht werden. Es wurden insgesamt 10 Leerzeichen verwendet.
Emp_name varchar2(10)
- Wenn Sie einen Wert mit weniger als 10 Stellen eingeben, wird der verbleibende Speicherplatz automatisch gelöscht
create table deleteme_table(v varchar(10), v2 varchar2(10)); insert into deleteme_table (v, v2) values ('abc','abc'); select v, length(v), v2, length(v2) from deleteme_table;