Oracle heeft verschillende character data types die veel gebruikt worden en ook verwarrend kunnen zijn als je de verschillen ertussen niet kent. Leer wat ze zijn en wat de verschillen ertussen zijn in dit artikel.
De Oracle character data types die het meest worden gebruikt zijn CHAR en VARCHAR2. Er is ook een VARCHAR datatype.
Laten we eens kijken wat elk van deze datatypes zijn.
CHAR Datatype
Het CHAR datatype slaat karakterwaarden op. Het slaat deze waarden op als een string met een vaste lengte.
Dit betekent dat string-waarden worden opgevuld, of dat er spatietekens aan worden toegevoegd, om te worden opgeslagen in de database.
De maximale lengte van een CHAR-waarde is 2000 bytes.
Laten we hier eens een voorbeeld van zien.
Ik zal een voorbeeld tabel maken met alle drie van deze data types, wat data invoegen, en kijken wat het laat zien.
CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));
Nu, laten we een waarde invoegen.
INSERT INTO chartest (char_column)VALUES ('abcde');
Nu, laten we de waarde eens opvragen. Ik zal de waarde opvragen, en de waarde tussen haakjes (om te zien waar spaties staan), de lengte controleren, en er dan een DUMP op uitvoeren om wat statistieken te zien.
SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;
Resultaat:
CHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
abcde | (abcde ) | 10 | Typ=96 Len=10: 97,98,99,100,101,32,32,32,32 |
Zoals u kunt zien, is de waarde van abcde bij het opslaan opgevuld met spaties om de lengte op 10 te brengen. In de uitvoer van de DUMP-functie kunt u de codes zien voor elk teken dat is opgeslagen. Karakter 32 is een spatie.
VARCHAR Datatype
Het VARCHAR datatype is een ANSI standaard datatype, daarom is het opgenomen in Oracle.
Het is op dit moment echter hetzelfde als het VARCHAR2 datatype.
Het is opgenomen in Oracle om onderscheid te kunnen maken tussen NULL en lege strings, wat VARCHAR zou moeten doen, volgens de ANSI standaard. In Oracle doet hij dat echter niet. Het werkt als een VARCHAR2 waar lege strings worden behandeld als NULL waarden.
Dus, in Oracle, is het verschil tussen VARCHAR en VARCHAR2 niets. Ze zijn hetzelfde.
Je moet het gegevenstype VARCHAR niet gebruiken, omdat het gereserveerd is voor toekomstige Oracle-functionaliteit en het zou kunnen veranderen.
Laten we eens een voorbeeld zien. We gebruiken dezelfde tabel als eerder, en voegen wat gegevens in.
INSERT INTO chartest (varchar_column)VALUES ('fghij');
Nu, laten we deze gegevens selecteren.
SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;
Resultaat:
VARCHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
fghij | (fghij) | 5 | Typ=1 Len=5: 102,103,104,105,106 |
Je ziet dat de waarde tussen haakjes geen spaties bevat, dat komt omdat VARCHAR2 en VARCHAR geen spaties toevoegen (wat ik zo dadelijk zal bespreken). Het is ook een lengte van 5 tekens.
VARCHAR2 Datatype
Het VARCHAR2 datatype wordt gebruikt om strings van variabele lengte op te slaan. Dit betekent dat u een maximumgrootte definieert, en dat de strings die u in de kolom invoegt, worden opgeslagen zoals ze worden aangeleverd. Er worden geen spaties aan toegevoegd, zoals bij het CHAR datatype.
De maximale lengte van een VARCHAR2 datatype is 4000 bytes. Dit is echter verhoogd tot 32.767 bytes als een van de nieuwe functies in Oracle 12c.
Laten we eens een voorbeeld zien.
INSERT INTO chartest (varchar2_column)VALUES ('klmno');
Nu, laten we het resultaat bevragen.
SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;
Resultaat:
VARCHAR2_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
klmno | (klmno) | 5 | Typ=1 Len=5: 107,108,109,110,111 |
Je ziet dat de uitvoer hetzelfde is als het VARCHAR voorbeeld. Er zijn geen spaties toegevoegd, en de lengte is hetzelfde. Het enige verschil zijn de ASCII code karakters omdat de input string anders was.
Verschillen: CHAR vs VARCHAR vs VARCHAR2
Laten we eens kijken naar de verschillen tussen deze drie gegevenstypen.
- VARCHAR en VARCHAR2 zijn precies hetzelfde. CHAR is anders.
- CHAR heeft een maximale grootte van 2000 bytes, en VARCHAR/VARCHAR2 heeft een maximale grootte van 4000 bytes (of 32.767 in Oracle 12c)
- CHAR hoeft geen grootte te specificeren en heeft een standaardgrootte van 1. Een grootte moet worden opgegeven met VARCHAR/VARCHAR2 kolommen.
- CHAR zal spaties aan de rechterkant van strings opvullen om overeen te komen met de lengte van de kolom, terwijl VARCHAR/VARCHAR2 dat niet doet.
De prestaties van CHAR, VARCHAR, en VARCHAR2 zijn hetzelfde. Er is geen verschil in prestaties met deze gegevenstypen. CHAR is niet sneller dan VARCHAR2, en VARCHAR2 is niet sneller dan CHAR.
Tom Kyte heeft een post op AskTom die de technische details hiervan uitlegt. Hij legt ook uit dat een lege VARCHAR2 precies hetzelfde is als een CHAR-waarde.
Denk hier even over na.
Het lege opvullen van een VARCHAR2-waarde is hetzelfde als een CHAR-waarde.
De datatypes zijn bijna identiek.
Welke van deze datatypes moet je dan gebruiken?
Zoals Tom Kyte op zijn forum en in zijn boek heeft besproken (en waar ik het mee eens ben), is er geen reden om ooit het CHAR datatype te gebruiken. VARCHAR2 kan alle situaties aan waar een CHAR zou kunnen worden overwogen – zelfs een CHAR(1) die hetzelfde is als een VARCHAR2(1).
VARCHAR vs VARCHAR2
Het verschil tussen VARCHAR en VARCHAR2 in Oracle is dat VARCHAR een ANSI-standaard datatype is dat een onderscheid tussen NULL en lege strings ondersteunt. Oracle heeft dit onderscheid nog niet geïmplementeerd, dus op dit moment zijn VARCHAR en VARCHAR2 hetzelfde. Het is veiliger om VARCHAR2 te gebruiken, omdat je niet wilt dat code breekt als Oracle in de toekomst VARCHAR wijzigt en je code VARCHAR gebruikt.