Wat is het verschil tussen varchar en varchar2?
Antwoord 1, autoriteit 100%
Voorlopig zijn het synoniemen.
VARCHAR
is gereserveerd door Oracle
om in de toekomst onderscheid te maken tussen NULL
en lege tekenreeks, als ANSI
-standaard voorschrijft.
VARCHAR2
maakt geen onderscheid tussen een NULL
en een lege tekenreeks, en zal dat ook nooit doen.
Als u erop vertrouwt dat een lege tekenreeks en NULL
hetzelfde zijn, moet u VARCHAR2
gebruiken.
Antwoord 2, autoriteit 12%
Momenteel gedraagt VARCHAR zich precies hetzelfde als VARCHAR2. Het type VARCHAR
mag echter niet worden gebruikt omdat het is gereserveerd voor toekomstig gebruik.
Genomen van: Verschil tussen CHAR, VARCHAR, VARCHAR2
Antwoord 3, autoriteit 10%
Genomen uit de nieuwste stabiele Oracle-productieversie 12.2:
Gegevenstypen
Het belangrijkste verschil is dat VARCHAR2
een intern gegevenstypeis en VARCHAR
een extern gegevenstypeis. We moeten dus het verschil begrijpen tussen een intern en extern gegevenstype…
Binnen een database worden waarden opgeslagen in kolommen in tabellen. Intern vertegenwoordigt Oracle data in bepaalde formaten die bekend staan als interne datatypes.
Over het algemeen werken OCI-toepassingen (Oracle Call Interface) niet met interne gegevenstyperepresentaties van gegevens, maar met gegevenstypen in de hosttaal die vooraf zijn gedefinieerd door de taal waarin ze zijn geschreven. Wanneer gegevens worden overgedragen tussen een OCI-clienttoepassing en een databasetabel, converteren de OCI-bibliotheken de gegevens tussen interne gegevenstypen en externe gegevenstypen.
Externe typen bieden een gemak voor de programmeur door het mogelijk te maken om met hosttaaltypen te werken in plaats van eigen dataformaten. OCI kan een breed scala aan gegevenstypeconversies uitvoeren bij het overbrengen van gegevens tussen een Oracle-database en een OCI-toepassing. Er zijn meer externe OCI-gegevenstypen dan interne gegevenstypen van Oracle.
Het gegevenstype VARCHAR2
is een tekenreeks van variabele lengte met een maximale lengte van 4000 bytes. Als de parameter max_string_size init.ora standaard is, kan de maximale lengte van een VARCHAR2
4000 bytes zijn. Als de init.ora parameter max_string_size = extended, kan de maximale lengte van een VARCHAR2
32767 bytes zijn
Het gegevenstype VARCHAR
slaat tekenreeksen van verschillende lengtes op. De eerste 2 bytes bevatten de lengte van de tekenreeks en de resterende bytes bevatten de tekenreeks. De opgegeven lengte van de tekenreeks in een bind- of een definitieaanroep moet de twee lengtebytes bevatten, dus de grootste VARCHAR
-tekenreeks die kan worden ontvangen of verzonden is 65533 bytes lang, niet 65535.
Een snelle test in een 12.2 database suggereert dat Oracle als een intern gegevenstypeeen VARCHAR
nog steeds behandelt als een pseudotypevoor VARCHAR2
. Het is GEEN SYNONYM
wat een echt objecttype is 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)
Er zijn ook enkele implicaties van VARCHAR
voor ProC/C++ Precompiler-opties. Voor programmeurs die geïnteresseerd zijn, de link is op: Pro*C/ Handleiding voor C++-programmeurs
Antwoord 4
Na wat experimenteren (zie hieronder), kan ik bevestigen dat er vanaf september 2017 niets is veranderd met betrekking tot de functionaliteit die wordt beschreven in het geaccepteerde antwoord:-
- Rextester-demo voor Oracle 11g:
Lege tekenreeksen worden ingevoegd alsNULL
s voor beideVARCHAR
enVARCHAR2
. - LiveSQL-demo voor Oracle 12c:Zelfde resultaten.
De historische reden voor deze twee zoekwoorden wordt goed uitgelegd in een antwoord op een andere vraag.
Antwoord 5
-
VARCHAR kan tot 2000 bytes aan tekens opslaan, terwijl VARCHAR2 tot 4000 bytes aan tekens kan opslaan.
-
Als we het datatype VARCHAR declareren, zal het ruimte innemen voor NULL-waarden. In het geval van het VARCHAR2-gegevenstype neemt het geen ruimte in beslag voor NULL-waarden. bijv.,
name varchar(10)
zal 6 bytes geheugen reserveren, zelfs als de naam ‘Ravi__’ is, terwijl
name varchar2(10)
zal ruimte reserveren op basis van de lengte van de invoerreeks. bijv. 4 bytes geheugen voor ‘Ravi__’.
Hier staat _ voor NULL.
OPMERKING: varchar reserveert ruimte voor null-waarden en varchar2 reserveert geen ruimte voor null-waarden.
Antwoord 6
Momenteel zijn ze hetzelfde. maar eerder
- Ergens op het net las ik dat,
VARCHAR
is gereserveerd door Oracle om in de toekomst onderscheid te maken tussen NULL
en lege string, zoals de ANSI-standaard voorschrijft.
VARCHAR2
maakt geen onderscheid tussen een NULL
en een lege string, en zal dat ook nooit doen.
- Ook,
Emp_name varchar(10)
– als u een waarde van minder dan 10 cijfers invoert, kan de resterende ruimte niet worden verwijderd. het gebruikte in totaal 10 spaties.
Emp_name varchar2(10)
– als u een waarde van minder dan 10 cijfers invoert, wordt de resterende ruimte automatisch verwijderd