Was ist der Unterschied zwischen varchar und varchar2 in Oracle?

Antworten:

336

Im Moment sind sie Synonyme.

VARCHARist vorbehalten Oracle, um die Unterscheidung zwischen NULLund leeren Zeichenfolgen in Zukunft zu unterstützen, wie dies ANSIstandardmäßig vorgeschrieben ist.

VARCHAR2unterscheidet nicht zwischen einer NULLund einer leeren Zeichenfolge und wird es niemals tun.

Wenn Sie sich auf leere Zeichenfolgen verlassen und NULLdasselbe sind, sollten Sie verwenden VARCHAR2.

Quassnoi
quelle
40
Hatte diese Begründung noch nie gehört, das ist nützlich. Vielen Dank. Für die Aufzeichnung ist es immer noch total lächerlich, dass der Hauptcharaktertyp in Oracle "varchar2" ist. Kommt das nicht jemand anderem als schrecklicher Trottel vor? Scheint so, als hätte ich in meiner ersten Woche des Programmierlernens ein Problem gelöst.
Ian Varley
7
@Ian: Haupttyp ist, VARCHAR2weil es derzeit keinen Typ gibt, der sich so verhält, wie er VARCHARsollte. In der Tat sollten Sie überhaupt nicht verwenden, VARCHARbis es richtig implementiert ist.
Quassnoi
11
Danke, @Quassnoi. Der blöde Teil ist also, dass Oracle nicht wie jede andere Datenbank über ein richtiges VARCHAR verfügt. Hier ist etwas Dummes los, da bin ich mir sicher ... :)
Ian Varley
11
@ Ian: Als Oracle entwickelt wurde, gab es keine Standards. Zu dem Zeitpunkt, als die Standards aufkamen, war es bereits mit älteren Apps belastet. Wir alle wissen, wie es passiert.
Quassnoi
5
Entschuldigung, es war tatsächlich @UnKnown, der den falschen Kommentar geschrieben hat, auf den ich geantwortet habe . Die Tatsache , dass where x is NULLErträge unterschiedliche Ergebnisse aus where x = ''nicht nicht bedeuten , dass NULLund ''sind in keiner Weise anders. Das unterschiedliche Verhalten ist auf den =Bediener zurückzuführen.
Dan Lenski
38

Derzeit verhält sich VARCHAR genauso wie VARCHAR2. Der Typ VARCHARsollte jedoch nicht verwendet werden, da er für die zukünftige Verwendung reserviert ist.

Entnommen aus: Unterschied zwischen CHAR, VARCHAR, VARCHAR2

Brian
quelle
@PhilipRego VARCHARsollte nicht verwendet werden. Ich habe es bearbeitet
bugybunny
29

Entnommen aus der neuesten stabilen Oracle-Produktionsversion 12.2: Datentypen

Der Hauptunterschied besteht darin, dass VARCHAR2es sich um einen internen und VARCHAReinen 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 VARCHAR2Datentyp 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 VARCHAR24000 Byte betragen . Wenn der init.ora-Parameter max_string_size = erweitert ist, kann die maximale Länge von a VARCHAR232767 Byte betragen

Der VARCHARDatentyp 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 VARCHARLä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 VARCHARals Pseudotyp für behandelt VARCHAR2. Es ist KEIN SYNONYMtatsä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 VARCHARauf ProC / C ++ - Precompiler-Optionen. Für interessierte Programmierer befindet sich der Link unter: Pro * C / C ++ - Programmierhandbuch

Sandmann
quelle
1
Bedeutet das also, dass VARCHARimmer noch behandelt '' == null?
2
Ja. Die obige Diskussion der internen und externen Typen stammt aus der OCI-Referenz. Die 12.2 SQL-Sprachreferenz enthält immer noch dieselbe Anweisung "Nicht verwenden", die sie für VARCHAR immer hatte.
William Robertson
Aus diesem Grund habe ich die OCI-Unterschiede besprochen, andernfalls ist es für die zukünftige Verwendung ziemlich reserviert oder wie sie sagen 'variable Länge', was auf Zeichensätze wie Multi-Byte-UTF8 hindeuten könnte ...
Sandman
1
Sie haben gezeigt, dass als VARCHAR deklarierte Werte in der Datenbank als VARCHAR2 gespeichert werden. Die maximale Länge von VARCHAR (65533 Byte) ist jedoch größer als die maximale Länge von VARCHAR2 (32767 Byte). Wie geht die Datenbank damit um?
Piotr Dobrogost
IIRC, vor langer Zeit (vielleicht Oracle 6?) Gab es einen VARCHAR-Typ, der sich beim Auffüllen von Leerzeichen schlecht benahm - oder Leerzeichen abschnitt? AAR, VARCHAR2 war die Antwort. Oracle hat gesagt, dass sie VARCHAR zurückbringen werden, aber ich bin sicher, es wird Zähneknirschen geben, wenn die leere Zeichenfolge NICHT NULL ist.
JMD
2

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 : -

  1. Rextester Demo für Oracle 11g: Leere Strings werden als eingefügtNULLs für beideVARCHAR undVARCHAR2.
  2. LiveSQL-Demo für Oracle 12c: Gleiche Ergebnisse.

Der historische Grund für diese beiden Schlüsselwörter wird in einer Antwort auf eine andere Frage gut erklärt .

Steve Chambers
quelle
0
  1. VARCHAR kann bis zu 2000 Byte Zeichen speichern, während VARCHAR2 bis zu 4000 Byte Zeichen speichern kann.

  2. 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.

Palak Jain
quelle
2
Ich denke, diese Antwort ist verwirrend VARCHARmit CHAR.
Jon Heller
0

Derzeit sind sie gleich. aber vorher

  1. Irgendwo im Netz habe ich das gelesen,

VARCHARwird von Oracle reserviert, um die Unterscheidung zwischen NULLund leeren Zeichenfolgen in Zukunft zu unterstützen, wie es der ANSI-Standard vorschreibt.

VARCHAR2unterscheidet nicht zwischen einer NULLund einer leeren Zeichenfolge und wird es niemals tun.

  1. Ebenfalls,

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

Ramkumar P.
quelle
Ich bin kürzlich auf diesen Beitrag gestoßen. Bitte beachten Sie, dass er falsch ist. Führen Sie Folgendes aus und beide Felder bestehen aus 3 Zeichen: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;
Brian Leach
-1

VARCHAR ist das Synonym für VARCHAR2. Sie sollten VARCHAR jedoch nicht verwenden, da Oracle möglicherweise in Zukunft seine Semantik ändert.

Premraj
quelle