Forskellen mellem CHAR-, VARCHAR- og VARCHAR2-datatyper i Oracle

Oracle har flere karakterdatatyper, der ofte anvendes, og som også kan være forvirrende, hvis du ikke kender forskellene mellem dem. Lær, hvad de er, og hvilke forskelle der er mellem dem i denne artikel.

De Oracle-tegndatatyper, der bruges oftest, er CHAR og VARCHAR2. Der findes også en VARCHAR-datatype.

Lad os se, hvad hver af disse datatyper er.

CHAR-datatatype

Datatypen CHAR gemmer karakterværdier. Den gemmer disse værdier som en streng med en fast længde.

Det betyder, at strengværdier vil blive polstret eller få tilføjet mellemrumskarakterer for at blive gemt i databasen.

Den maksimale længde af en CHAR-værdi er 2000 bytes.

Lad os se et eksempel på dette.

Jeg opretter en eksempeltabel med alle tre af disse datatyper, indsætter nogle data og ser, hvad den viser.

CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));

Lad os nu indsætte en værdi.

INSERT INTO chartest (char_column)VALUES ('abcde');

Lad os nu forespørge på værdien. Jeg vil forespørge værdien og værdien inden for parenteser (for at se, hvor der er mellemrum), kontrollere længden og derefter udføre en DUMP på den for at se nogle statistikker.

SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;

Resultat:

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,32,32

Som du kan se, er værdien af abcde blevet polstret med mellemrum, når den er gemt, for at få den op på en længde på 10. I DUMP-funktionens output kan du se koderne for hvert tegn, der er gemt. Karakter 32 er et mellemrum.

VARCHAR Datatype

Datatypen VARCHAR er en ANSI-standard datatype, hvilket er grunden til, at den er med i Oracle.

Den er dog i øjeblikket den samme som datatypen VARCHAR2.

Den blev med i Oracle for at give mulighed for at skelne mellem NULL og tomme strenge, hvilket VARCHAR ifølge ANSI-standarden skal gøre. I Oracle gør den det imidlertid ikke. Den fungerer som en VARCHAR2, hvor tomme strenge behandles som NULL-værdier.

Så i Oracle er forskellen mellem VARCHAR og VARCHAR2 ingenting. De er det samme.

Du bør ikke bruge datatypen VARCHAR, da den er reserveret til fremtidig Oracle-funktionalitet, og den kan ændre sig.

Lad os se et eksempel. Vi bruger den samme tabel som tidligere, og indsætter nogle data.

INSERT INTO chartest (varchar_column)VALUES ('fghij');

Nu skal vi vælge disse data.

SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;

Resultat:

VARCHAR_COLUMN COL_FULL COL_LENGTH COL_DUMP
fghij (fghij) (fghij) 5 Typ=1 Len=5: 102,103,104,105,106

Du kan se, at værdien i parentes ikke indeholder mellemrum, hvilket skyldes, at VARCHAR2 og VARCHAR ikke tilføjer mellemrum (hvilket jeg vil diskutere om et øjeblik). Den har også en længde på 5 tegn.

VARCHAR2 Datatype

Datatypen VARCHAR2 bruges til at gemme strenge med variabel længde. Det betyder, at du definerer en maksimal størrelse, og de strenge, som du indsætter i kolonnen, vil blive gemt som de er angivet. Der vil ikke blive tilføjet mellemrum til tegnet, ligesom CHAR-datatypen.

Den maksimale længde for en VARCHAR2-datatatype er 4000 bytes. Dette blev dog hævet til 32.767 bytes som en af de nye funktioner i Oracle 12c.

Lad os se et eksempel.

INSERT INTO chartest (varchar2_column)VALUES ('klmno');

Nu skal vi spørge om resultatet.

SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;

Resultat:

VARCHAR2_COLUMN COL_FULL COL_LENGTH COL_DUMP
klmno (klmno) (klmno) 5 Typ=1 Len=5: 107,108,109,109,110,111

Du kan se, at resultatet er det samme som i VARCHAR-eksemplet. Der er ikke blevet tilføjet mellemrum, og længden er den samme. Den eneste forskel er ASCII-kodekaraktererne, fordi inputstrengen var anderledes.

Differencer: CHAR vs VARCHAR vs VARCHAR2

Lad os se på forskellene mellem disse tre datatyper.

  • VARCHAR og VARCHAR2 er nøjagtig de samme. CHAR er anderledes.
  • CHAR har en maksimal størrelse på 2000 bytes, og VARCHAR/VARCHAR2 har en maksimal størrelse på 4000 bytes (eller 32.767 i Oracle 12c)
  • CHAR behøver ikke at få angivet en størrelse og har en standardværdi på 1. Der skal angives en størrelse med VARCHAR/VARCHAR2-kolonner.
  • CHAR udfylder mellemrum til højre for strenge, så de passer til kolonnens længde, mens VARCHAR/VARCHAR2 ikke gør det.

Præstationen for CHAR, VARCHAR og VARCHAR2 er den samme. Der er ingen forskel i ydeevnen med disse datatyper. CHAR er ikke hurtigere end VARCHAR2, og VARCHAR2 er ikke hurtigere end CHAR.

Tom Kyte har et indlæg på AskTom, der forklarer de tekniske detaljer om dette. Han forklarer også, at en VARCHAR2-værdi med blankpolstring er nøjagtig det samme som en CHAR-værdi.

Tænk over dette et øjeblik.

Blankpolstring af en VARCHAR2-værdi er det samme som en CHAR-værdi.

Datatyperne er næsten identiske.

Så, hvilken af disse datatyper skal du bruge?

Som Tom Kyte har diskuteret på sit forum og i sin bog (og som jeg er enig i), er der ingen grund til nogensinde at bruge CHAR-datatypen. VARCHAR2 kan dække alle situationer, hvor en CHAR kan komme i betragtning – selv en CHAR(1), som er det samme som en VARCHAR2(1).

VARCHAR vs VARCHAR2

Skellen mellem VARCHAR og VARCHAR2 i Oracle er, at VARCHAR er en ANSI-standard datatype, der understøtter en skelnen mellem NULL og tomme strenge. Oracle har endnu ikke implementeret denne skelnen, så på nuværende tidspunkt er VARCHAR og VARCHAR2 den samme. Det er mere sikkert at bruge VARCHAR2, da du ikke ønsker, at nogen kode går i stykker, hvis Oracle ændrer VARCHAR i fremtiden, og din kode bruger VARCHAR.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.