Oracle má několik běžně používaných znakových datových typů, které mohou být matoucí, pokud neznáte rozdíly mezi nimi. V tomto článku se dozvíte, jaké jsou a jaké jsou mezi nimi rozdíly.
Znakové datové typy Oracle, které se používají nejčastěji, jsou CHAR a VARCHAR2. Existuje také datový typ VARCHAR.
Podívejme se, jaké jsou jednotlivé datové typy.
Datový typ CHAR
Datový typ CHAR uchovává znakové hodnoty. Tyto hodnoty ukládá jako řetězec s pevnou délkou.
To znamená, že řetězcové hodnoty budou při ukládání do databáze doplněny, neboli k nim budou přidány znaky mezery.
Maximální délka hodnoty CHAR je 2000 bajtů.
Podívejme se na příklad.
Vytvořím ukázkovou tabulku s použitím všech tří těchto datových typů, vložím do ní nějaká data a podívám se, co ukáže.
CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));
Nyní vložíme hodnotu.
INSERT INTO chartest (char_column)VALUES ('abcde');
Nyní se na tuto hodnotu zeptáme. Dotážu se na hodnotu a na hodnotu uvnitř závorek (abych viděl, kde jsou mezery), zkontroluji délku a pak na ní provedu DUMP, abych viděl nějaké statistiky.
SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;
Výsledek:
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 |
Jak vidíte, hodnota abcde byla při ukládání doplněna mezerami, aby dosáhla délky 10 bodů. Ve výstupu funkce DUMP můžete vidět kódy jednotlivých uložených znaků. Znak 32 je mezera.
Datový typ VARCHAR
Datový typ VARCHAR je standardní datový typ ANSI, proto je v systému Oracle obsažen.
V současné době je však stejný jako datový typ VARCHAR2.
Datový typ VARCHAR byl do systému Oracle zařazen proto, aby bylo možné rozlišovat mezi řetězci NULL a prázdnými řetězci, což by podle normy ANSI měl VARCHAR splňovat. V systému Oracle to však nedělá. Funguje jako VARCHAR2, kde se prázdné řetězce považují za hodnoty NULL.
V systému Oracle tedy rozdíl mezi VARCHAR a VARCHAR2 není žádný. Jsou stejné.
Datový typ VARCHAR byste neměli používat, protože je vyhrazen pro budoucí funkce Oracle a mohl by se změnit.
Podívejme se na příklad. Použijeme stejnou tabulku jako dříve a vložíme do ní nějaká data.
INSERT INTO chartest (varchar_column)VALUES ('fghij');
Nyní tato data vybereme.
SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;
Výsledek:
VARCHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
fghij | (fghij) | 5 | Typ=1 Len=5: 102,103,104,105,106 |
Vidíte, že hodnota v závorce neobsahuje mezery, což je způsobeno tím, že VARCHAR2 a VARCHAR nepřidávají mezery (což proberu za chvíli). Je také dlouhá 5 znaků.
Datový typ VARCHAR2
Datový typ VARCHAR2 se používá k ukládání řetězců proměnné délky. To znamená, že definujete maximální velikost a řetězce, které do sloupce vložíte, budou uloženy tak, jak jsou poskytnuty. Ke znakům se nebudou přidávat žádné mezery jako u datového typu CHAR.
Maximální délka datového typu VARCHAR2 je 4000 bajtů. V Oracle 12c však byla jako jedna z novinek zvýšena na 32 767 bajtů.
Podívejme se na příklad.
INSERT INTO chartest (varchar2_column)VALUES ('klmno');
Nyní se zeptáme na výsledek.
SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;
Výsledek:
VARCHAR2_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
klmno | (klmno) | 5 | Typ=1 Len=5: Výstup je stejný jako u příkladu VARCHAR: 107,108,109,110,111 |
Vidíte, že výstup je stejný jako u příkladu VARCHAR. Nebyly přidány žádné mezery a délka je stejná. Jediným rozdílem jsou znaky kódu ASCII, protože vstupní řetězec byl jiný.
Rozdíl: CHAR vs VARCHAR vs VARCHAR2
Podívejme se na rozdíly mezi těmito třemi datovými typy:
- VARCHAR a VARCHAR2 jsou naprosto stejné. CHAR se liší.
- CHAR má maximální velikost 2000 bajtů a VARCHAR/VARCHAR2 má maximální velikost 4000 bajtů (nebo 32 767 v Oracle 12c)
- CHAR nepotřebuje specifikovat velikost a má výchozí hodnotu 1. V případě, že je velikost specifikována, je třeba ji zadat. U sloupců VARCHAR/VARCHAR2 je třeba zadat velikost.
- CHAR doplní mezery napravo od řetězců tak, aby odpovídaly délce sloupce, zatímco VARCHAR/VARCHAR2 nikoli.
Výkonnost sloupců CHAR, VARCHAR a VARCHAR2 je stejná. U těchto datových typů není žádný rozdíl ve výkonu. CHAR není rychlejší než VARCHAR2 a VARCHAR2 není rychlejší než CHAR.
Tom Kyte má na AskTom příspěvek, který vysvětluje technické detaily tohoto problému. Vysvětluje také, že hodnota VARCHAR2 s prázdným polštářem je úplně stejná jako hodnota CHAR.
Přemýšlejte o tom chvíli.
Prázdný polštář hodnoty VARCHAR2 je stejný jako hodnota CHAR.
Tyto datové typy jsou téměř totožné.
Takže, který z těchto datových typů byste měli použít?
Jak Tom Kyte diskutoval na svém fóru a ve své knize (a já s tím souhlasím), není žádný důvod, proč nikdy používat datový typ CHAR. VARCHAR2 může pokrýt všechny situace, kdy by se dalo uvažovat o CHAR – dokonce i CHAR(1), který je stejný jako VARCHAR2(1).
VARCHAR vs VARCHAR2
Rozdíl mezi VARCHAR a VARCHAR2 v Oracle je ten, že VARCHAR je datový typ standardu ANSI, který podporuje rozlišení mezi NULL a prázdnými řetězci. Oracle zatím toto rozlišení neimplementoval, takže v současné době jsou VARCHAR a VARCHAR2 stejné. Je bezpečnější používat VARCHAR2, protože nechcete, aby se kód rozbil, pokud společnost Oracle v budoucnu změní VARCHAR a váš kód bude používat VARCHAR.