Oracle három adattípust használ a karakterláncok tárolására. – CHAR, VARCHAR és VARCHAR2. Miben különböznek egymástól? Mikor melyiket érdemes használni?
A cikkből megtudhatjuk a válaszokat.
A legegyszerűbb dolgot először is tegyük ki az útból: A VARCHAR és a VARCHAR2 ugyanaz. De hogy ez ma – ez még változhat. Nézze meg az Oracle 10G Release 2 dokumentációját:
Ne használja a
VARCHAR
adattípust. Használja helyette aVARCHAR2
adattípust. Bár aVARCHAR
adattípus jelenleg aVARCHAR2
szinonimája, aVARCHAR
adattípus a tervek szerint újradefiniálásra kerül, mint külön adattípus, amelyet változó hosszúságú karakterláncok összehasonlítására használnak eltérő összehasonlítási szemantikával.
Ebben a cikkben a VARCHAR2 alatt a VARCHAR és a VARCHAR2 egyaránt értendő, mivel ezek ma egyenértékűek.
Miben különbözik akkor a CHAR és a VARCHAR2?
A különbség az, hogy a CHAR(n) MINDIG n bájt hosszú lesz. Ha a karakterlánc hossza <n, akkor a beillesztéskor üresen kitöltésre kerül, hogy biztosítsa az n-es hosszúságot. A VARCHAR2(n) viszont 1-től n bájtig terjedő hosszúságú lesz. A VARCHAR2-ként tárolt rövidebb karakterlánc NEM lesz üresen kitöltve.
Tegyük fel például, hogy az “ORATABLE” karakterláncot egy CHAR(20) és egy VARCHAR2(20) mezőben tárolja. A CHAR mező 22 bájtot fog használni (2 bájt a vezető hossz miatt). A VARCHAR2 mező csak 10 bájtot fog használni (8 a karakterláncra, 2 bájt a vezető hosszra).
Összefoglalva, a CHAR a VARCHAR2 a maximális hosszra feltöltve.
Hogyan befolyásolja ez a különbség az SQL-eket?
Ez megváltoztatja a CHAR vs. VARCHAR2 karakterláncok megfeleltetésének módját. Nézze meg a gyakorlatban:
SQL> create table strings 2 (colchar char (20) 3 , colvarchar varchar2 (20));Table created.SQL>SQL> insert into strings 2 (colchar, colvarchar) 3 values 4 ('ORATABLE', 'ORATABLE');1 row created.SQL> -- Define a string variableSQL> var str varchar2(20)SQL> -- Give it a value with length < 20SQL> exec :str := 'ORATABLE'PL/SQL procedure successfully completed.SQL> -- Exact string match with CHARSQL> -- No result found!SQL> select 'found' found_flag 2 from strings 3 where colchar = :str;no rows selectedSQL> -- Padded string match with CHARSQL> -- Now it finds itSQL> select 'found' found_flag 2 from strings 3 where colchar = rpad(:str,20);FOUND-----found
Az üres részekkel való kitöltés tehát különbséget jelent abban, hogy a CHAR karakterlánc illeszkedik-e a változó hosszúságú paraméterhez. Az egyezéshez vagy rpad-elni kell az értéket, vagy rtrim-elni az oszlopot.
VARCHAR2 esetén nincs ilyen követelmény:
SQL> -- Exact string match with VARCHAR2SQL> -- Result found!SQL> select 'found' found_flag 2 from strings 3 where colvarchar = :str;FOUND-----found
Mikor használjunk CHAR-t, mikor VARCHAR2-t?
Ha mindig csak VARCHAR2-t használunk, és figyelmen kívül hagyjuk a CHAR-t, sokkal egyszerűbb lesz az életünk. Nincs különbség a kettő között, kivéve, hogy a CHAR több helyet használ, ha a karakterláncok nem mindig a rögzített maximális hosszúságúak. Ráadásul a CHAR több zavart okoz a lekérdezések írásakor.
A CHAR-t csak Y/N típusú értékekhez használom adatbázis oszlopként. (Nincs BOOLEAN oszlop adattípus, emlékszel?) Ez úgy működik, mint egy “flag” vagy “switch” típusú oszlop jelölése – de ugyanúgy lehetne VARCHAR2 is.
Minden más karakterlánc esetében VARCHAR2.
Összefoglaló
Az Oracle CHAR, VARCHAR és VARCHAR2 adattípusait vizsgálva ne feledjük, hogy:
- A VARCHAR és a VARCHAR2 ugyanaz, de a VARCHAR funkciója a jövőben változhat. Használja a VARCHAR2-t.
- CHAR és VARCHAR2 abban különbözik, hogy a CHAR üresen kitölti a karakterláncokat, hogy azok maximális hosszúságúak legyenek. A VARCHAR2 nem végez üres kitöltést.
- A fentiek miatt a CHAR oszlopon végzett karakterlánc-összehasonlítást tartalmazó lekérdezések nagyobb körültekintést igényelnek – a CHAR-ral összehasonlított VARCHAR2-t rpad-del kell kitölteni, hogy találatot kapjunk.
- Meg kell ismételni: használjunk VARCHAR2-t!