Tabulka 8-4. Typy znaků
Název | Popis |
---|---|
znak různý(n), varchar(n) | proměnná délka s omezením |
znak(n), char(n) | pevná délka, prázdný s výplní |
text | proměnná neomezené délky |
Tabulka8-4 uvádí typy znaků pro obecné použití, které jsou k dispozici vPostgreSQL.
SQL definuje dva základníznakové typy: character varying(n) a character(n), kdeeren je celé kladné číslo. Oba tyto typy mohou uchovávat řetězce o délce až n znaků (nikoli bajtů). Pokus o uložení delšího řetězce do sloupce těchto typů povede k chybě, pokud všechny nadbytečné znaky nejsou mezery, v takovém případě bude řetězec zkrácen na maximální délku (tato poněkud bizarní výjimka je vyžadována standardem SQL.) Pokud je ukládaný řetězec kratší než deklarovaná délka, hodnoty typu character budou doplněny mezerami; hodnoty typucharacter varying jednoduše uloží kratší řetězec.
Pokud explicitně nastavíme hodnotu na charactervarying(n) nebo character(n), pak bude hodnota s překročenou délkou zkrácena na n znaků, aniž by to vyvolalo chybu. (Toto je vyžadováno standardem SQL.)
Zápisy varchar(n) a char(n) jsou aliasy pro character varying(n)a character(n). character bez specifikátoru délky je ekvivalentní kcharacter(1). Pokud je použit typ charactervarying bez specifikátoru délky, typ akceptuje řetězce libovolné velikosti. Druhý typ je rozšířením PostgreSQL.
PostgreSQL navíc poskytuje typ text, který ukládá řetězce libovolné délky. Ačkoli typ text není ve standardu SQL, má ho i několik dalších systémů pro správu databází SQL.
Hodnoty typu znak jsou fyzicky doplněny mezerami na zadanou šířku n a takto jsou uloženy a zobrazeny, nicméně mezery pro doplnění jsou považovány za sémanticky nevýznamné. Při porovnávání dvou hodnot typu znak se na koncové mezery nebere ohled a při převodu hodnoty znaku na některý z ostatních typů řetězců se odstraní. Všimněte si, že koncové mezery jsou sémantickyvýznamné u různých znakových a textových hodnot a při použití porovnávání vzorů, např. LIKE, regulárních výrazů.
Potřeba paměti pro krátký řetězec (do 126 bajtů) je1 bajt plus vlastní řetězec, který zahrnuje výplňovou mezeru v případě znaku. Delší řetězce mají místo 1 bajtu režii 4. Dlouhé řetězce jsou systémem automaticky komprimovány, takže fyzický požadavek na disk může být menší. Velmi dlouhé hodnoty jsou také ukládány do tabulek na pozadí, aby nebránily rychlému přístupu ke kratším hodnotám sloupců. v každém případě je nejdelší možný znakový řetězec, který lze nejlépe uložit, asi 1 GB. (Maximální hodnota, která bude povolena pron v deklaraci datového typu, je menší než tato. Nebylo by užitečné to měnit, protože u vícebajtových kódování znaků může být počet znaků a bajtů zcela odlišný. Pokud si přejete ukládat dlouhé řetězce se specifickým horním limitem, použijte raději textové nebo znakové variace bez specifikátoru délky, než abyste si vymýšleli libovolný limit délky.”
Tip: Mezi těmito třemi typy není žádný výkonnostní rozdíl, kromě většího úložného prostoru při použití typu s prázdným políčkem a několika cyklů procesoru navíc pro kontrolu délky při ukládání do sloupce s omezenou délkou. Zatímco znak(n) má v některých jiných databázových systémech výkonnostní výhody, v PostgreSQL žádná taková výhoda neexistuje; ve skutečnosti je znak(n) obvykle nejpomalejší ze všech tří typů kvůli dodatečným nákladům na ukládání. Ve většině situací by se místo toho měl používat text nebo znakový zápis.
Pro informace o syntaxi řetězcových literálů odkazujeme na kapitolu 4.1.2.1 a pro informace o dostupných operátorech a funkcích na kapitolu 9. Znaková sada databázeurčuje znakovou sadu použitou pro ukládání textových hodnot; dalšíinformace o podpoře znakových sad naleznete v části 22.3.
Příklad 8-1. Použití typů znaků
CREATE TABLE test1 (a character(4));INSERT INTO test1 VALUES ('ok');SELECT a, char_length(a) FROM test1; -- (1) a | char_length------+------------- ok | 2CREATE TABLE test2 (b varchar(5));INSERT INTO test2 VALUES ('ok');INSERT INTO test2 VALUES ('good ');INSERT INTO test2 VALUES ('too long');ERROR: value too long for type character varying(5)INSERT INTO test2 VALUES ('too long'::varchar(5)); -- explicit truncationSELECT b, char_length(b) FROM test2; b | char_length-------+------------- ok | 2 good | 5 too l | 5
char_length
je popsána v oddíle 9.4. V databázi PostgreSQL existují ještě dva další typy znaků s pevnou délkou, které jsou uvedeny v tabulce 8-5. Typ name existuje pouze pro ukládání identifikátorův interních katalozích systému a není určen pro použití běžným uživatelem. Jeho délka je v současné době definována jako 64 bajtů (63použitelných znaků plus terminátor), ale ve zdrojovém kódu jazyka C by měl být odkazován pomocí konstanty NAMEDATALEN. Délka se nastavuje při kompilaci(a je tedy nastavitelná pro speciální použití); výchozí maximální délka se může v některé z budoucích verzí změnit. Typ “char” (všimněte si uvozovek) se liší od typu char(1) tím, že využívá pouze jeden bajt paměti. Vnitřně se používá v systémových katalozích jako zjednodušený výčtový typ.
Tabulka 8-5. Speciální typy znaků
Název | Velikost úložiště | Popis |
---|---|---|
“char” | 1 byte | single-.bajtový interní typ |
jméno | 64 bajtů | interní typ pro jména objektů |