Ebben a fejezetben a PostgreSQL-ben használt adattípusokról lesz szó. Táblázat létrehozásakor minden oszlophoz megadunk egy adattípust, azaz, hogy milyen adatokat szeretnénk tárolni a tábla mezőiben.
Ez több előnyt is lehetővé tesz –
-
Konzisztencia – Az azonos adattípusú oszlopokkal végzett műveletek konzisztens eredményeket adnak, és általában a leggyorsabbak.
-
Validálás – Az adattípusok megfelelő használata az adatok formátumának érvényesítését és az adattípus hatókörén kívül eső adatok elutasítását jelenti.
-
Tömörség – Mivel egy oszlop egyetlen értéktípust tárolhat, ezért kompakt módon tárolható.
-
Teljesítmény – Az adattípusok megfelelő használata az adatok leghatékonyabb tárolását biztosítja. A tárolt értékek gyorsan feldolgozhatók, ami növeli a teljesítményt.
A PostgreSQL az adattípusok széles körét támogatja. Emellett a felhasználók a CREATE TYPE SQL paranccsal saját egyéni adattípust is létrehozhatnak. Az adattípusoknak különböző kategóriái vannak a PostgreSQL-ben. Ezeket az alábbiakban tárgyaljuk.
- Numerikus típusok
- Monetary Types
- Karaktertípusok
- Bináris adattípusok
- Dátum/idő típusok
- Boolean típus
- A felsorolásos típus
- Geometrikus típus
- Hálózati cím típusa
- Bit String Type
- Text Search Type
- UUID Type
- XML típus
- JSON Type
- Tömb típus
- Tömbök deklarálása
- Értékek beillesztése
- Tömbök elérése
- Tömbök módosítása
- Tömbök keresése
- Kompozit típusok
- A kompozit típusok deklarálása
- Kompozit értékbevitel
- Az összetett típusok elérése
- Tartománytípusok
- Tárgyazonosító típusok
- Pseudo Types
Numerikus típusok
A numerikus típusok kétbájtos, négybájtos és nyolcbájtos egész számokból, négybájtos és nyolcbájtos lebegőpontos számokból, valamint választható pontosságú tizedesjegyekből állnak. A következő táblázat felsorolja a rendelkezésre álló típusokat.
Név | Tárolási méret | Megnevezés | Tartomány |
---|---|---|---|
smallint | 2 byte | small-range integer | -32768 to +32767 |
integer | 4 bytes | typical choice for integer | -2147483648 és +2147483647 |
bigint | 8 byte | nagy tartományú egész szám | -9223372036854775808 – 9223372036854775807 |
decimális | változó | felhasználó által megadott pontosság,exact | legfeljebb 131072 számjegyig a tizedesvessző előtt; legfeljebb 16383 számjegy a tizedespont után |
numerikus | változó | felhasználó által megadott pontosság, exact | a tizedespont előtt legfeljebb 131072 számjegyig; legfeljebb 16383 számjegy a tizedespont után |
reális | 4 bájt | változó pontosságú,pontatlan | 6 tizedesjegy pontosság |
dupla pontosság | 8 bájt | változó pontosságú,inexact | 15 tizedesjegy pontosság |
smallserial | 2 byte | small autoincrementing. integer | 1-től 32767-ig |
serial | 4 byte | autoincrementing integer | 1 214748483647 |
bigserial | 8 byte | large autoincrementing integer | 1 to 9223372036854775807 |
Monetary Types
A pénz típus egy pénzösszeget tárol fix tört pontossággal. A numeric, int és bigint adattípusok értékei pénzzé alakíthatók. A lebegőpontos számok használata nem ajánlott a pénz kezelésére a kerekítési hibák lehetősége miatt.
Név | Tárolási méret | leírás | tartomány |
---|---|---|---|
pénz | 8 bájt | pénzösszeg | -92233720368547758.08 és +92233720368547758.07 |
Karaktertípusok
Az alábbi táblázat a PostgreSQL-ben elérhető általános célú karaktertípusokat tartalmazza.
S. No. | Név & Leírás |
---|---|
1 |
karakter változó(n), varchar(n) variable-length with limit |
2 |
character(n), char(n) fixed-length, blank padded |
3 |
text változó korlátlan hosszúságú |
Bináris adattípusok
A bytea adattípus az alábbi táblázat szerinti bináris karakterláncok tárolását teszi lehetővé.
Név | Tárolási méret | Megnevezés |
---|---|---|
bytea | 1 vagy 4 bájt plusz a tényleges bináris string | változó-hosszú bináris karakterlánc |
Dátum/idő típusok
A PostgreSQL támogatja az SQL dátum és idő típusok teljes készletét, ahogyan az az alábbi táblázatban látható. A dátumokat a Gergely-naptár szerint számoljuk. Itt minden típus felbontása 1 mikroszekundum / 14 számjegy, kivéve a dátumtípust, amelynek felbontása nap.
Név | Tárolási méret | leírás | alacsony érték | magas érték |
---|---|---|---|---|
időbélyeg | 8 byte | mind a dátum és az idő (nincs időzóna) | 4713 BC | 294276 AD |
TIMESTAMPTZ | 8 byte | mind a dátum és az idő, időzónával | 4713 BC | 294276 AD |
date | 4 byte | date (no time of day) | 4713 BC | 5874897 AD |
time | 8 byte | time of day (no date) | 00:00:00 | 24:00:00 |
időzónával | 12 bájt | csak napszak, időzónával | 00:00:00+1459 | 24:00:00-1459 |
intervallum | 12 bájt | időintervallum | -178000000 év | 178000000 év |
Boolean típus
A PostgreSQL a standard SQL Boolean típust biztosítja. A Boolean adattípusnak lehetnek true, false és egy harmadik állapota, az ismeretlen, amelyet az SQL null értéke képvisel.
Név | Tárolási méret | leírás |
---|---|---|
boolean | 1 byte | az igaz vagy hamis állapota |
A felsorolásos típus
A felsorolásos (enum) típusok olyan adattípusok, amelyek egy statikus, értékek rendezett halmazából állnak. Ezek megfelelnek a számos programozási nyelvben támogatott enum típusoknak.
A többi típustól eltérően az enumerált típusokat a CREATE TYPE paranccsal kell létrehozni. Ez a típus statikus, rendezett értékkészlet tárolására szolgál. Például iránytű irányok, azaz ÉSZAK, DÉL, KELET és NYUGAT, vagy a hét napjai, mint az alábbiakban látható –
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
A felsorolásos, miután létrehoztuk, ugyanúgy használható, mint bármely más típus.
Geometrikus típus
A geometrikus adattípusok kétdimenziós térbeli objektumokat ábrázolnak. A legalapvetőbb típus, a pont képezi az alapját az összes többi típusnak.
Név | Tárolási méret | Reprezentáció | leírás |
---|---|---|---|
pont | 16 bájt | pont a síkon | (x,y) |
vonal | 32 bájt | Végtelen vonal (nem teljesen implementálva) | ((x1,y1),(x2,y2)) |
lseg | 32 byte | Véges vonalszakasz | ((x1,y1),(x2,y2)) |
box | 32 byte | Téglalap alakú doboz | ((x1,y1),(x2,y2)) |
útvonal | 16+16n bájt | Zárt útvonal (poligonhoz hasonló) | ((x1,y1),…) |
útvonal | 16+16n bájt | nyitott útvonal | |
poligon | 40+16n | Poligon (zárt útvonalhoz hasonló) | ((x1,y1),….) |
kör | 24 bájt | Kör | <(x,y),r> (középpont és sugár) |
Hálózati cím típusa
A PostgreSQL az IPv4, IPv6 és MAC címek tárolására kínál adattípusokat. A hálózati címek tárolására jobb ezeket a típusokat használni a sima szöveges típusok helyett, mert ezek a típusok bemeneti hibaellenőrzést és speciális operátorokat és függvényeket kínálnak.
Név | Tárolási méret | Megnevezés |
---|---|---|
cidr | 7 vagy 19 bájt | IPv4 és IPv6 hálózatok |
inet | 7 vagy 19. bájt | IPv4 és IPv6 hosztok és hálózatok |
macaddr | 6 bájt | MAC-címek |
Bit String Type
A bitmaszkok tárolására a Bit String Types szolgálnak. Ezek vagy 0 vagy 1 értékűek. Két SQL bit típus létezik: bit(n) és bit varying(n), ahol n egy pozitív egész szám.
Text Search Type
Ez a típus támogatja a teljes szöveges keresést, amely a természetes nyelvű dokumentumok gyűjteményében való keresést jelenti a lekérdezésnek leginkább megfelelő dokumentumok megtalálása érdekében. Ehhez két adattípus létezik –
S. No. | Név & Leírás |
---|---|
1 |
tsvektor Ez egy rendezett lista különböző szavakból, amelyeket normalizáltak, hogy egyesítsék ugyanazon szó különböző változatait, az úgynevezett “lexémákat”. |
2 |
tsquery Ez tárolja a keresendő lexémákat, és a Boolean operátorok & (AND), | (OR), és a ! (NOT). Az operátorok csoportosítását zárójelekkel lehet kikényszeríteni. |
UUID Type
A UUID (Universally Unique Identifiers) kisbetűs hexadecimális számjegyek sorozataként íródik, több, kötőjellel elválasztott csoportban, konkrétan egy nyolcjegyű csoport, majd három négyjegyű csoport, majd egy 12jegyű csoport, összesen 32 számjegy, ami 128 bitet jelent.
Egy UUID példa: – 550e8400-e29b-41d4-a716-446655440000
XML típus
Az XML adattípus XML adatok tárolására használható. XML adatok tárolásához először XML értékeket kell létrehozni az xmlparse függvény segítségével az alábbiak szerint –
XMLPARSE (DOCUMENT '<?xml version="1.0"?><tutorial><title>PostgreSQL Tutorial </title> <topics>...</topics></tutorial>')XMLPARSE (CONTENT 'xyz<foo>bar</foo><bar>foo</bar>')
JSON Type
A json adattípus JSON (JavaScript Object Notation) adatok tárolására használható. Az ilyen adatok szövegként is tárolhatók, de a json adattípusnak megvan az az előnye, hogy ellenőrzi, hogy minden tárolt érték érvényes JSON-érték-e. Vannak kapcsolódó támogató függvények is, amelyek közvetlenül használhatók a JSON adattípus kezelésére az alábbiak szerint.
Példa | Példa Eredmény |
---|---|
array_to_json(‘{{1,5},{99,100}}’::int) | ,] |
row_to_json(row(1,’foo’)) | {“f1”:1, “f2”: “foo”} |
Tömb típus
A PostgreSQL lehetőséget ad arra, hogy egy táblázat oszlopát változó hosszúságú többdimenziós tömbként definiáljuk. Bármilyen beépített vagy felhasználó által definiált alaptípus, enum típus vagy összetett típusú tömbök hozhatók létre.
Tömbök deklarálása
A tömb típus deklarálható
CREATE TABLE monthly_savings ( name text, saving_per_quarter integer, scheme text);
vagy az “ARRAY” kulcsszó használatával
CREATE TABLE monthly_savings ( name text, saving_per_quarter integer ARRAY, scheme text);
Értékek beillesztése
A tömb értékeit szó szerinti konstansként lehet beilleszteni, az elemértékeket szögletes zárójelek közé zárva és vesszővel elválasztva. Egy példa az alábbiakban látható –
INSERT INTO monthly_savings VALUES ('Manisha', '{20000, 14600, 23500, 13250}', '{{"FD", "MF"}, {"FD", "Property"}}');
Tömbök elérése
Egy példa a tömbök elérésére az alábbiakban látható. Az alábbi parancs kiválasztja azokat a személyeket, akiknek a második negyedévben több a megtakarításuk, mint a negyedik negyedévben.
SELECT name FROM monhly_savings WHERE saving_per_quarter > saving_per_quarter;
Tömbök módosítása
A tömbök módosítására az alábbi példa látható.
UPDATE monthly_savings SET saving_per_quarter = '{25000,25000,27000,27000}'WHERE name = 'Manisha';
vagy az ARRAY kifejezés szintaxisának használatával –
UPDATE monthly_savings SET saving_per_quarter = ARRAYWHERE name = 'Manisha';
Tömbök keresése
A tömbök keresésére az alábbi példa látható.
SELECT * FROM monthly_savings WHERE saving_per_quarter = 10000 ORsaving_per_quarter = 10000 ORsaving_per_quarter = 10000 ORsaving_per_quarter = 10000;
Ha a tömb mérete ismert, akkor a fenti keresési módszer használható. Ellenkező esetben a következő példa azt mutatja, hogyan kell keresni, ha a méret nem ismert.
SELECT * FROM monthly_savings WHERE 10000 = ANY (saving_per_quarter);
Kompozit típusok
Ez a típus a mezőnevek és adattípusaik listáját jelenti, azaz, egy táblázat sorának vagy rekordjának szerkezetét.
A kompozit típusok deklarálása
A következő példa mutatja, hogyan kell deklarálni egy kompozit típust
CREATE TYPE inventory_item AS ( name text, supplier_id integer, price numeric);
Ez az adattípus az alábbi módon használható a táblázatok létrehozásában –
CREATE TABLE on_hand ( item inventory_item, count integer);
Kompozit értékbevitel
A kompozit értékeket szó szerinti konstansként lehet beírni, a mezőértékeket zárójelek közé zárva és vesszővel elválasztva. Egy példa az alábbiakban látható –
INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);
Ez a fent definiált inventory_itemre érvényes. A ROW kulcsszó valójában opcionális, amennyiben a kifejezésben egynél több mező szerepel.
Az összetett típusok elérése
Az összetett oszlop valamelyik mezőjének eléréséhez használjunk pontot, amelyet a mező neve követ, hasonlóan ahhoz, mintha a táblázat nevéből választanánk ki egy mezőt. Például az on_hand példatáblánk néhány almezőjének kiválasztásához a lekérdezés az alábbi módon történne –
SELECT (item).name FROM on_hand WHERE (item).price > 9.99;
A táblázat nevét is használhatja (például egy multitable lekérdezésben), például így –
SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;
Tartománytípusok
A tartománytípusok olyan adattípusokat jelentenek, amelyek egy adattartományt használnak. A tartománytípusok lehetnek diszkrét tartományok (pl. az összes egész számérték 1-től 10-ig) vagy folytonos tartományok (pl, bármely időpont 10:00 és 11:00 között).
A beépített…rendelkezésre álló beépített tartománytípusok közé tartoznak a következő tartományok –
-
int4range – Egész szám tartomány
-
int8range – Bigint tartomány
-
numrange – Numerikus tartomány
-
tsrange –
-
tsrange. Range of timestamp without time zone
-
tstzrange – Range of timestamp with time zone
-
daterrange – Range of date
Custom range types can be created to make new types of range available, például IP-címtartományok az inet típust használva alapként, vagy lebegőszám-tartományok a float adattípust használva alapként.
A tartománytípusok támogatják az inkluzív és exkluzív tartományhatárokat a és ( ) karakterek használatával. Például a ‘[4,9)’ a 4-től kezdődő és a 4-et is magában foglaló, de a 9-et nem tartalmazó összes egész számot jelenti.
Tárgyazonosító típusok
A tárgyazonosítókat (OID) a PostgreSQL belsőleg különböző rendszertáblák elsődleges kulcsaként használja. Ha a WITH OIDS van megadva, vagy a default_with_oids konfigurációs változó engedélyezve van, csak akkor, ilyen esetekben kerülnek OID-k a felhasználó által létrehozott táblákhoz. A következő táblázat több alias típust is felsorol. Az OID alias típusok nem rendelkeznek saját műveletekkel, kivéve a speciális beviteli és kimeneti rutinokat.
Név | leírás | érték Példa | |
---|---|---|---|
oid | minden | numeric objektum azonosító | 564182 |
regproc | pg_proc | funkció neve | sum |
regprocedure | pg_proc | függvény argumentumtípusokkal | sum(int4) |
regoperator | pg_operator | operátor neve | + |
regoperátor | pg_operátor | operátor argumentumtípusokkal | *(integer,integer) vagy -(NONE,integer) |
regclass | pg_class | relation name | pg_type |
regtype | pg_type | adattípus neve | integer |
regconfig | pg_ts_config | szöveges keresési konfiguráció | English |
regdictionary | pg_ts_dict | szöveges keresési szótár | simple |
Pseudo Types
A PostgreSQL típusrendszer számos speciális-célú bejegyzéseket, amelyeket együttesen pszeudotípusoknak nevezünk. Egy pszeudotípus nem használható oszlop adattípusként, de egy függvény argumentum- vagy eredménytípusának deklarálására használható.
Az alábbi táblázat a létező pszeudotípusokat sorolja fel.
S. No. | Név & Leírás |
---|---|
1 |
any Jelzi, hogy a függvény bármilyen bemeneti adattípust elfogad. |
2 |
anyelement Jelzi, hogy a függvény bármilyen adattípust elfogad. |
3 |
anyarray Jelzi, hogy a függvény bármilyen tömb adattípust elfogad. |
4 |
anynonarray Jelzi, hogy a függvény bármilyen nem tömbös adattípust elfogad. |
5 |
anyenum Jelzi, hogy a függvény bármilyen enum adattípust elfogad. |
6 |
anyrange Jelzi, hogy a függvény bármely tartomány adattípust elfogad. |
7 |
cstring Jelzi, hogy a függvény nullvégű C stringet fogad el vagy ad vissza. |
8 |
belső Megjelöli, hogy egy függvény elfogad vagy visszaad egy kiszolgálón belüli adattípust. |
9 |
language_handler A procedurális nyelvi híváskezelő úgy van deklarálva, hogy visszaadja a language_handler-t. |
10 |
fdw_handler A foreign-data wrapper handler úgy van deklarálva, hogy az fdw_handler-t adja vissza. |
11 |
record Egy olyan függvényt azonosít, amely egy meg nem határozott sortípust ad vissza. |
12 |
trigger Egy trigger függvényt úgy deklaráltak, hogy trigger-t ad vissza. |
13 |
void Jelzi, hogy egy függvény nem ad vissza értéket. |