Skillnaden mellan CHAR-, VARCHAR- och VARCHAR2-datatyper i Oracle

Oracle har flera teckendatatyper som används ofta, men som också kan vara förvirrande om du inte känner till skillnaderna mellan dem. Lär dig vad de är och skillnaderna mellan dem i den här artikeln.

De Oracle-teckendatatyper som används oftast är CHAR och VARCHAR2. Det finns också en VARCHAR-datatyp.

Låt oss se vad var och en av dessa datatyper är.

CHAR Datatype

Datatypen CHAR lagrar teckenvärden. Den lagrar dessa värden som en sträng med fast längd.

Detta innebär att strängvärden kommer att fyllas på, eller få mellanslagstecken tillagt, för att lagras i databasen.

Den maximala längden på ett CHAR-värde är 2000 bytes.

Vi ska se ett exempel på detta.

Jag skapar en exempeltabell som använder alla tre datatyperna, lägger in data och ser vad den visar.

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

Nu ska vi lägga in ett värde.

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

Nu ska vi fråga efter värdet. Jag frågar efter värdet och värdet inom parenteser (för att se var mellanslag finns), kontrollerar längden och utför sedan en DUMP på det för att se lite statistik.

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

Som du kan se har värdet abcde fyllts med mellanslag när det lagrats för att få en längd på 10. I utdata från DUMP-funktionen kan du se koderna för varje tecken som lagras. Tecken 32 är ett mellanslag.

VARCHAR Datatype

Datatypen VARCHAR är en ANSI-standardiserad datatyp, vilket är anledningen till att den finns med i Oracle.

För tillfället är den dock densamma som datatypen VARCHAR2.

Den finns med i Oracle för att göra det möjligt att göra skillnad på NULL och tomma strängar, vilket är vad VARCHAR ska göra, enligt ANSI-standarden. I Oracle gör den dock inte det. Den fungerar som en VARCHAR2 där tomma strängar behandlas som NULL-värden.

Så i Oracle är skillnaden mellan VARCHAR och VARCHAR2 ingenting. De är samma sak.

Du bör inte använda datatypen VARCHAR eftersom den är reserverad för framtida Oracle-funktionalitet och den kan komma att ändras.

Vi ska se ett exempel. Vi använder samma tabell som tidigare och lägger in några data.

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

Nu ska vi välja dessa 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) 5 Typ=1 Len=5: 102,103,104,105,106

Du kan se att värdet inom parentes inte innehåller mellanslag, vilket beror på att VARCHAR2 och VARCHAR inte lägger till mellanslag (vilket jag kommer att diskutera om en stund). Det har också en längd på 5 tecken.

VARCHAR2 Datatype

Datatypen VARCHAR2 används för att lagra strängar med variabel längd. Det innebär att du definierar en maximal storlek, och de strängar som du infogar i kolumnen lagras så som de tillhandahålls. Inga mellanslag kommer att läggas till tecknet, som i datatypen CHAR.

Den maximala längden för en VARCHAR2-datatyp är 4000 byte. Detta höjdes dock till 32 767 bytes som en av de nya funktionerna i Oracle 12c.

Vi ska se ett exempel.

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

Nu ska vi fråga efter 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) 5 Typ=1 Len=5: 107,108,109,110,111

Du kan se att resultatet är detsamma som i VARCHAR-exemplet. Inga mellanslag har lagts till och längden är densamma. Den enda skillnaden är ASCII-kodtecknen eftersom inmatningssträngen var annorlunda.

Differenser: CHAR vs VARCHAR vs VARCHAR2

Låt oss ta en titt på skillnaderna mellan dessa tre datatyper.

  • VARCHAR och VARCHAR2 är exakt likadana. CHAR är annorlunda.
  • CHAR har en maximal storlek på 2000 byte och VARCHAR/VARCHAR2 har en maximal storlek på 4000 byte (eller 32 767 i Oracle 12c)
  • CHAR behöver inte ha en storlek angiven och har standardvärdet 1. En storlek måste anges med VARCHAR/VARCHAR2-kolumner.
  • CHAR fyller ut mellanslag till höger om strängar för att matcha kolumnens längd, medan VARCHAR/VARCHAR2 inte gör det.

Prestandan för CHAR, VARCHAR och VARCHAR2 är densamma. Det finns ingen skillnad i prestanda med dessa datatyper. CHAR är inte snabbare än VARCHAR2 och VARCHAR2 är inte snabbare än CHAR.

Tom Kyte har ett inlägg på AskTom som förklarar de tekniska detaljerna kring detta. Han förklarar också att ett VARCHAR2-värde med blankpaddning är exakt samma sak som ett CHAR-värde.

Tänk på detta ett ögonblick.

Blankpaddning av ett VARCHAR2-värde är samma sak som ett CHAR-värde.

Datatyperna är nästan identiska.

Så, vilken av dessa datatyper ska du använda?

Som Tom Kyte har diskuterat på sitt forum och i sin bok (och som jag håller med om) finns det ingen anledning att någonsin använda datatypen CHAR. VARCHAR2 kan täcka alla situationer där en CHAR kan övervägas – till och med en CHAR(1) som är samma sak som en VARCHAR2(1).

VARCHAR vs VARCHAR2

Skillnaden mellan VARCHAR och VARCHAR2 i Oracle är att VARCHAR är en ANSI-standardiserad datatyp som har stöd för en åtskillnad mellan NULL och tomma strängar. Oracle har ännu inte implementerat den här distinktionen, så för tillfället är VARCHAR och VARCHAR2 samma sak. Det är säkrare att använda VARCHAR2 eftersom du inte vill att någon kod ska gå sönder om Oracle ändrar VARCHAR i framtiden och din kod använder VARCHAR.

Lämna ett svar

Din e-postadress kommer inte publiceras.