A CHAR, VARCHAR és VARCHAR2 adattípusok közötti különbség az Oracle-ben

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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.