A CHAR, VARCHAR és VARCHAR2 közötti különbség

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 a VARCHAR2 adattípust. Bár a VARCHAR adattípus jelenleg a VARCHAR2 szinonimája, a VARCHAR 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!

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

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