8-4. táblázat. Karaktertípusok
név | leírás |
---|---|
karakter változó(n), varchar(n) | variable-length with limit |
karakter(n), char(n) | fixed-length, blank padded |
text | variable unlimited length |
A8-4. táblázat aPostgreSQL-ben elérhető általános célú karaktertípusokat mutatja.
AzSQL két elsődlegeskaraktertípust definiál: character varying(n) és character(n), aholeren egy pozitív egész szám. Mindkét típus legfeljebb n karakter (nem bájt) hosszúságú karakterláncok tárolására alkalmas. Ha ennél hosszabb karakterláncot próbálunk tárolni egy ilyen típusú oszlopban, az hibát eredményez, kivéve, ha a többlet karakterek mind szóközök, amely esetben a karakterláncot a maximális hosszúságra vágja le (ezt a kissé bizarr kivételt az SQL szabvány írja elő).) Ha a tárolni kívánt karakterlánc rövidebb, mint a deklarált hosszúság, a karakter típusú értékek szóközökkel lesznek kitöltve; a változó karakter típusú értékek egyszerűen a rövidebb karakterláncot fogják tárolni.
Ha egy értéket kifejezetten charactervarying(n)-re vagy character(n)-re adunk, akkor a túl hosszú értéket hiba nélkül n karakterre vágjuk le. (Ezt az SQLstandard megköveteli.)
A varchar(n) és a char(n) jelölések a character varying(n)és a character(n) aliasai. character hosszmeghatározás nélkül egyenértékű acharacter(1)-el. Ha a charactervaryinget hosszmeghatározó nélkül használjuk, a típus bármilyen méretű karakterláncot elfogad. Ez utóbbi a PostgreSQL kiterjesztése.
A PostgreSQL ezen kívül biztosítja a text típust, amely tetszőleges hosszúságú karakterláncokat tárol. Bár a text típus nem szerepel az SQL szabványban, több más SQL adatbázis-kezelő rendszer is rendelkezik vele.
A karakter típusú értékeket fizikailag szóközökkel töltik ki a megadott n szélességig, és így tárolják és jelenítik meg.A kitöltő szóközöket azonban szemantikailag jelentéktelennek kezelik. A karakter típusú értékek összehasonlításakor a szóközöket figyelmen kívül hagyjuk, és eltávolítjuk őket, amikor a karakter értéket más karakterlánc típusok valamelyikébe konvertáljuk. Megjegyzendő, hogy a hátul lévő szóközök szemantikailagjelentősek a változó karakter- és szövegértékekben, valamint a mintaillesztés, pl. LIKE, reguláris kifejezések használatakor.
A rövid karakterláncok (legfeljebb 126 bájt) tárolási igénye 1 bájt plusz a tényleges karakterlánc, amely tartalmazza a karakterek esetében a szóközök kitöltését. A hosszabb karakterláncoknál 1 helyett 4 bájt többletköltséggel jár. A hosszú karakterláncokat a rendszer automatikusan tömöríti, így a fizikai igény a lemezen kisebb lehet. A nagyon hosszú értékek háttértáblákban is tárolódnak, hogy ne akadályozzák a rövidebb oszlopértékek gyors elérését.Mindenesetre a leghosszabb lehetséges karakterlánc, amely tárolható, körülbelül 1 GB. (Az adattípus-deklarációban megengedett maximális érték ennél kisebb. Ezt nem lenne célszerű megváltoztatni, mert a többbájtos karakterkódolásoknál a karakterek és a bájtok száma igen eltérő lehet. Ha hosszú karakterláncokat szeretne tárolni nemspecifikus felső határértékkel, használjon szöveges vagy karakterváltozót hosszmeghatározás nélkül, ahelyett, hogy önkényes hosszhatárt találna ki.)
Tipp: Nincs teljesítménybeli különbség e három típus között, eltekintve a megnövekedett tárolási helytől az üres kitöltésű típus használatakor, és néhány extra CPU-ciklustól a hossz ellenőrzéséhezhosszkorlátozott oszlopba való tároláskor. Míg a karakter(n) néhány más adatbázis-rendszerben teljesítményelőnyökkel rendelkezik, a PostgreSQL-ben nincs ilyen előny; valójában a karakter(n) általában a leglassabb a három közül, mivel többlet-tárolási költségei miatt. A legtöbb helyzetben ehelyett astext vagy charactervariálást kell használni.
A string literálok szintaxisáról a 4.1.2.1. szakaszban, a rendelkezésre álló operátorokról és függvényekről pedig a 9. fejezetben találhatók információk. Az adatbázis karakterkészlete határozza meg a szöveges értékek tárolására használt karakterkészletet; a karakterkészlet-támogatással kapcsolatos további információkért lásd a 22.3. szakaszt.
A 8-1. példa. A karaktertípusok használata
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
funkciót a 9.4. szakasz tárgyalja. A PostgreSQL-ben két másik fix hosszúságú karaktertípus is létezik, amelyeket a8-5. táblázat mutat be. A name típus csak az azonosítók tárolására létezik a belső rendszerkatalógusokban, és nem az általános felhasználó általi használatra szolgál. Hossza jelenleg 64 bájtban van meghatározva (63bájtos karakterek plusz terminátor), de a C forráskódban a NAMEDATALEN konstans használatával kell hivatkozni rá. A hossz a fordításkor kerül beállításra (és ezért speciális felhasználási célokra beállítható); az alapértelmezett maximális hossz egy későbbi kiadásban változhat. A “char” típus (figyeljük meg az idézőjeleket) abban különbözik a char(1)-től, hogy csak egy bájtnyi tárhelyet használ. A rendszerkatalógusokban belsőleg egy egyszerűsített felsorolástípusként használatos.
Táblázat 8-5. Speciális karaktertípusok
név | tárolási méret | leírás |
---|---|---|
“char” | 1 byte | single-byte belső típus |
név | 64 byte | belső típus objektumok neveihez |