Az Oracle több olyan karakteres adattípussal rendelkezik, amelyeket gyakran használnak, és amelyek zavaróak is lehetnek, ha nem ismerjük a köztük lévő különbségeket. Ebben a cikkben megtudhatja, hogy mik ezek, és mi a különbség közöttük.
A leggyakrabban használt Oracle karakteres adattípusok a CHAR és a VARCHAR2. Létezik egy VARCHAR adattípus is.
Lássuk, hogy mik ezek az adattípusok.
CHAR adattípus
A CHAR adattípus karakteres értékeket tárol. Ezeket az értékeket rögzített hosszúságú karakterláncként tárolja.
Ez azt jelenti, hogy a karakterlánc-értékeket fel kell tölteni, vagy szóköz karaktereket kell hozzáadni, hogy az adatbázisban tárolhatók legyenek.
A CHAR érték maximális hossza 2000 bájt.
Lássunk erre egy példát.
Elkészítek egy mintatáblát mindhárom adattípust használva, beszúrok néhány adatot, és megnézem, mit mutat.
CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));
Most, szúrjunk be egy értéket.
INSERT INTO chartest (char_column)VALUES ('abcde');
Most, kérdezzük le az értéket. Lekérdezem az értéket és a zárójelben lévő értéket (hogy lássam, hol vannak szóközök), ellenőrzöm a hosszát, majd elvégzek rajta egy DUMP-ot, hogy lássak néhány statisztikát.
SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;
Eredmény:
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 |
Amint látható, az abcde értékét tároláskor szóközökkel töltöttük fel, hogy 10 hosszú legyen. A DUMP függvény kimenetén láthatja az egyes tárolt karakterek kódjait. A 32. karakter egy szóköz.
VARCHAR adattípus
A VARCHAR adattípus egy ANSI szabványos adattípus, ezért szerepel az Oracle-ben.
Mindenesetre jelenleg megegyezik a VARCHAR2 adattípussal.
Azért került az Oracle-be, hogy lehetővé tegye a NULL és az üres karakterláncok megkülönböztetését, amit az ANSI szabvány szerint a VARCHAR-nak kellene tennie. Az Oracle-ben azonban nem ezt teszi. Úgy működik, mint a VARCHAR2, ahol az üres karakterláncokat NULL értékként kezeli.
Az Oracle-ben tehát a VARCHAR és a VARCHAR2 közötti különbség semmi. Ugyanazok.
Nem szabad a VARCHAR adattípust használni, mivel az Oracle jövőbeli funkciói számára van fenntartva, és ez változhat.
Lássunk egy példát. Ugyanazt a táblát használjuk, mint korábban, és beillesztünk néhány adatot.
INSERT INTO chartest (varchar_column)VALUES ('fghij');
Most válasszuk ki ezeket az adatokat.
SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;
Eredmény:
VARCHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
fghij | (fghij) | 5 | Typ=1 Len=5: 102,103,104,105,106 |
Láthatjuk, hogy a zárójelben lévő érték nem tartalmaz szóközöket, ami azért van, mert a VARCHAR2 és a VARCHAR nem ad hozzá szóközöket (erről mindjárt lesz szó). A hossza is 5 karakter.
VARCHAR2 adattípus
A VARCHAR2 adattípus változó hosszúságú karakterláncok tárolására szolgál. Ez azt jelenti, hogy meghatároz egy maximális méretet, és az oszlopba beillesztett karakterláncok a megadott módon kerülnek tárolásra. A CHAR adattípushoz hasonlóan a karakterekhez nem adódnak szóközök.
A VARCHAR2 adattípus maximális hossza 4000 bájt. Ezt azonban az Oracle 12c egyik újdonságaként 32 767 bájtra emelték.
Lássunk egy példát.
INSERT INTO chartest (varchar2_column)VALUES ('klmno');
Most kérdezzük le az eredményt.
SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;
Eredmény:
VARCHAR2_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
klmno | (klmno) | 5 | Typ=1 Len=5: 107,108,109,110,111 |
Láthatjuk, hogy a kimenet ugyanaz, mint a VARCHAR példánál. Nem kerültek hozzá szóközök, és a hossz is ugyanaz. Az egyetlen különbség az ASCII kódkarakterekben van, mivel a bemeneti karakterlánc más volt.
Különbségek: CHAR vs VARCHAR vs VARCHAR2
Nézzük meg a három adattípus közötti különbségeket.
- VARCHAR és VARCHAR2 pontosan ugyanazok. A CHAR különbözik.
- A CHAR maximális mérete 2000 bájt, a VARCHAR/VARCHAR2 maximális mérete pedig 4000 bájt (vagy 32,767 az Oracle 12c-ben)
- A CHAR-nak nem kell megadni a méretét, és az alapértelmezett mérete 1. A CHAR-nak nem kell megadni a méretét. A VARCHAR/VARCHAR2 oszlopoknál meg kell adni a méretet.
- ACHAR kitölti a szóközöket a karakterláncok jobb oldalán, hogy megfeleljen az oszlop hosszának, míg a VARCHAR/VARCHAR2 nem.
A CHAR, a VARCHAR és a VARCHAR2 teljesítménye megegyezik. Nincs különbség a teljesítményben ezeknél az adattípusoknál. A CHAR nem gyorsabb, mint a VARCHAR2, és a VARCHAR2 nem gyorsabb, mint a CHAR.
Tom Kyte az AskTom-on közzétett egy bejegyzést, amely elmagyarázza ennek technikai részleteit. Azt is elmagyarázza, hogy egy üresen kitöltött VARCHAR2 pontosan ugyanolyan, mint egy CHAR érték.
Gondolkodjunk el ezen egy pillanatra.
A VARCHAR2 érték üresen kitöltése ugyanolyan, mint egy CHAR érték.
Az adattípusok szinte azonosak.
Szóval, melyik adattípust érdemes használni?
Amint azt Tom Kyte a fórumán és a könyvében is tárgyalta (és én is egyetértek vele), nincs okunk arra, hogy valaha is a CHAR adattípust használjuk. A VARCHAR2 minden olyan helyzetet lefed, ahol a CHAR szóba jöhet – még a CHAR(1) is, ami ugyanaz, mint a VARCHAR2(1).
VARCHAR vs VARCHAR2
A VARCHAR és a VARCHAR2 közötti különbség az Oracle-ben az, hogy a VARCHAR egy ANSI-szabványos adattípus, amely támogatja a NULL és az üres karakterláncok megkülönböztetését. Az Oracle még nem implementálta ezt a megkülönböztetést, így jelenleg a VARCHAR és a VARCHAR2 ugyanaz. Biztonságosabb a VARCHAR2 használata, mivel nem szeretné, ha bármilyen kód megtörne, ha az Oracle a jövőben megváltoztatja a VARCHAR-t, és a kódja VARCHAR-t használ.