I det här kapitlet kommer vi att diskutera de datatyper som används i PostgreSQL. När du skapar en tabell anger du för varje kolumn en datatyp, dvs, vilken typ av data du vill lagra i tabellens fält.
Detta möjliggör flera fördelar –
-
Konsistens – Operationer mot kolumner med samma datatyp ger konsekventa resultat och är vanligtvis snabbast.
-
Validering – Korrekt användning av datatyper innebär formatvalidering av data och förkastande av data utanför datatypernas räckvidd.
-
Kompakthet – Eftersom en kolumn kan lagra en enda typ av värde lagras den på ett kompakt sätt.
-
Prestationer – Korrekt användning av datatyper ger den mest effektiva lagringen av data. De lagrade värdena kan bearbetas snabbt, vilket förbättrar prestandan.
PostgreSQL har stöd för en bred uppsättning datatyper. Dessutom kan användare skapa sina egna anpassade datatyper med hjälp av kommandot CREATE TYPE SQL. Det finns olika kategorier av datatyper i PostgreSQL. De diskuteras nedan.
- Numeriska typer
- Monetärtyper
- Teckentyper
- Binära datatyper
- Dato- och tidstyper
- Boolisk typ
- Enumererad typ
- Geometric Type
- Nätverksadress-typ
- Bit String Type
- Textsökningstyp
- UUID Typ
- XML-typ
- JSON Type
- Array Type
- Deklaration av matriser
- Insättning av värden
- Accessing Arrays
- Modifiera matriser
- Sökning av matriser
- Composite Types
- Deklaration av sammansatta typer
- Inmatning av sammansatta värden
- Accessing Composite Types
- Rangtyper
- Objektidentifieringstyper
- Pseudotyper
Numeriska typer
Numeriska typer består av två-byte, fyra-byte och åtta-byte heltal, fyra-byte och åtta-byte flyttalstal och decimaler med valbar precision. I följande tabell visas de tillgängliga typerna.
Namn | Lagringsstorlek | Beskrivning | Utbud |
---|---|---|---|
smallint | 2 bytes | small-range heltal | -32768 till +32767 |
integer | 4 bytes | typiskt val för heltal | -2147483648 till +2147483647 |
bigint | 8 bytes | normalt heltal | -9223372036854775808 till 9223372036854775807 |
decimal | variabel | användarspecifik precision,exakt | upp till 131072 siffror före decimalpunkten; upp till 16383 siffror efter decimalpunkten |
numerisk | variabel | användarspecificerad precision, exakt | upp till 131072 siffror före decimalpunkten; upp till 16383 siffror efter decimalpunkten |
real | 4 bytes | variabel precision,inexakt | 6 decimalsiffror precision |
dubbel precision | 8 bytes | variabel precision,inexakt | 15 decimalsiffror precision |
smallseriell | 2 bytes | small autoinkrementering heltal | 1 till 32767 |
seriell | 4 bytes | autoinkrementerande heltal | 1 till 2147483647 |
bigserial | 8 bytes | stort autoinkrementerande heltal | 1 till 9223372036854775807 |
Monetärtyper
Penningtypen lagrar ett valutabelopp med en fast bråkprecision. Värden av datatyperna numeric, int och bigint kan kastas till money. Användning av flyttal rekommenderas inte för att hantera pengar på grund av risken för avrundningsfel.
Namn | Lagringsstorlek | Beskrivning | Utbud |
---|---|---|---|
pengar | 8 bytes | valutasumma | -92233720368547758.08 till +92233720368547758.07 |
Teckentyper
Tabellen nedan innehåller en förteckning över de allmänna teckentyper som finns tillgängliga i PostgreSQL.
S. Nr. | Namn & Beskrivning |
---|---|
1 |
Karaktär som varierar(n), varchar(n) variabel längd med gräns |
2 |
tecken(n), char(n) fast längd, blank padded |
3 |
text variabel obegränsad längd |
Binära datatyper
Datatypen bytea möjliggör lagring av binära strängar enligt tabellen nedan.
Namn | Lagringsstorlek | Beskrivning |
---|---|---|
bytea | 1 eller 4 bytes plus den faktiska binära strängen | variabel-längd binärsträng |
Dato- och tidstyper
PostgreSQL har stöd för en fullständig uppsättning SQL-dato- och tidstyper, som visas i tabellen nedan. Datum räknas enligt den gregorianska kalendern. Här har alla typerna en upplösning på 1 mikrosekund / 14 siffror utom datumtypen, vars upplösning är dag.
Namn | Slagringsstorlek | Beskrivning | Lågt värde | Högt värde |
---|---|---|---|---|
tidsstämpel | 8 Bytes | både datum och tid (ingen tidszon) | 4713 BC | 294276 AD |
TIMESTAMPTZ | 8 bytes | både datum och tid, med tidszon | 4713 BC | 294276 AD |
datum | 4 bytes | datum (ingen tid på dagen) | 4713 BC | 5874897 AD |
time | 8 bytes | tid på dagen (inget datum) | 00:00:00 | 24:00:00 |
tid med tidszon | 12 bytes | något om dagen, endast med tidszon | 00:00:00+1459 | 24:00:00-1459 |
intervall | 12 bytes | tidsintervall | -178000000 år | 178000000 år |
Boolisk typ
PostgreSQL tillhandahåller den standardiserade SQL-typen Boolean. Den booleska datatypen kan ha tillstånden true (sant), false (falskt) och ett tredje tillstånd, unknown (okänt), som representeras av SQL-värdet null (noll).
Namn | Lagringsstorlek | Beskrivning |
---|---|---|
boolean | 1 byte | tillståndet sant eller falskt |
Enumererad typ
Enumererade (enum) typer är datatyper som omfattar en statisk, ordnad uppsättning av värden. De motsvarar de enumtyper som stöds i ett antal programmeringsspråk.
Till skillnad från andra typer måste uppräknade typer skapas med kommandot CREATE TYPE. Den här typen används för att lagra en statisk, ordnad uppsättning värden. Till exempel kompassriktningar, dvs. NORTH, SOUTH, EAST och WEST eller veckodagar enligt nedan –
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
Enumerated kan efter att ha skapats användas på samma sätt som alla andra typer.
Geometric Type
Geometriska datatyper representerar tvådimensionella rumsliga objekt. Den mest grundläggande typen, punkten, utgör grunden för alla andra typer.
Namn | Lagringsstorlek | Representation | Beskrivning |
---|---|---|---|
Punkt | 16 bytes | Punkt på ett plan | (x,y) |
linje | 32 bytes | Oändlig linje (inte helt implementerat) | ((x1,y1),(x2,y2)) |
lseg | 32 bytes | Enligt linjesegment | ((x1,y1),(x2,y2)) |
box | 32 bytes | Rektangulär box | ((x1,y1),(x2,y2)) |
sökväg | 16+16n bytes | Sluten sökväg (liknande polygon) | ((x1,y1),…) |
sökväg | 16+16n bytes | Öppen sökväg | |
polygon | 40+16n | Polygon (liknar sluten sökväg) | ((x1,y1),…) |
circle | 24 bytes | Circle | <(x,y),r> (centrumpunkt och radie) |
Nätverksadress-typ
PostgreSQL erbjuder datatyper för att lagra IPv4, IPv6 och MAC-adresser. Det är bättre att använda dessa typer istället för vanliga texttyper för att lagra nätverksadresser, eftersom dessa typer erbjuder inmatningsfelkontroll och specialiserade operatörer och funktioner.
Namn | Lagringsstorlek | Beskrivning |
---|---|---|
cidr | 7 eller 19 bytes | IPv4- och IPv6-nätverk |
inet | 7 eller 19. bytes | IPv4- och IPv6-värdar och nätverk |
macaddr | 6 bytes | MAC-adresser |
Bit String Type
Bit String Types används för att lagra bitmasker. De är antingen 0 eller 1. Det finns två SQL-bitstyper: bit(n) och bit varying(n), där n är ett positivt heltal.
Textsökningstyp
Denna typ stöder fulltextsökning, vilket är aktiviteten att söka genom en samling av dokument i naturligt språk för att hitta de dokument som bäst matchar en förfrågan. Det finns två datatyper för detta –
S. No. | Namn & Beskrivning |
---|---|
1 |
tsvector Detta är en sorterad lista över distinkta ord som har normaliserats för att slå samman olika varianter av samma ord, så kallade ”lexem”. |
2 |
tsquery Detta lagrar lexem som ska sökas och kombinerar dem med respekt för de booleska operatörerna & (AND), | (OR) och ! (NOT). Parenteser kan användas för att tvinga fram gruppering av operatörerna. |
UUID Typ
En UUID (Universally Unique Identifiers) skrivs som en sekvens av hexadecimala siffror med små bokstäver, i flera grupper som skiljs åt av bindestreck, närmare bestämt en grupp med åtta siffror, följt av tre grupper med fyra siffror, följt av en grupp med 12 siffror, för totalt 32 siffror som representerar de 128 bitarna.
Ett exempel på ett UUID är – 550e8400-e29b-41d4-a716-446655440000
XML-typ
Den XML-datatypen kan användas för att lagra XML-data. För att lagra XML-data måste du först skapa XML-värden med hjälp av funktionen xmlparse enligt följande –
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
Datatypen json kan användas för att lagra JSON-data (JavaScript Object Notation). Sådana data kan också lagras som text, men json-datatypen har fördelen att den kontrollerar att varje lagrat värde är ett giltigt JSON-värde. Det finns också relaterade stödfunktioner som kan användas direkt för att hantera JSON-datatypen enligt följande.
Exempel | Exempel Resultat |
---|---|
array_to_json(’{{1,5},{99,100}}’::int) | ,] |
row_to_json(row(1,’foo’)) | {”f1”:1, ”f2”: ”foo”} |
Array Type
PostgreSQL ger möjlighet att definiera en kolumn i en tabell som en multidimensionell array med variabel längd. Arrayer av vilken inbyggd eller användardefinierad bastyp, enumtyp eller sammansatt typ som helst kan skapas.
Deklaration av matriser
Matriser kan deklareras som
CREATE TABLE monthly_savings ( name text, saving_per_quarter integer, scheme text);
eller genom att använda nyckelordet ”ARRAY” som
CREATE TABLE monthly_savings ( name text, saving_per_quarter integer ARRAY, scheme text);
Insättning av värden
Matriser kan sättas in som bokstavskonstanter, genom att omsluta elementvärdena inom parenteser och separera dem med kommatecken. Ett exempel visas nedan –
INSERT INTO monthly_savings VALUES ('Manisha', '{20000, 14600, 23500, 13250}', '{{"FD", "MF"}, {"FD", "Property"}}');
Accessing Arrays
Ett exempel för accessing Arrays visas nedan. Kommandot nedan kommer att välja ut de personer vars sparande är större under andra kvartalet än under fjärde kvartalet.
SELECT name FROM monhly_savings WHERE saving_per_quarter > saving_per_quarter;
Modifiera matriser
Ett exempel på att modifiera matriser visas nedan.
UPDATE monthly_savings SET saving_per_quarter = '{25000,25000,27000,27000}'WHERE name = 'Manisha';
eller genom att använda syntaxen för ARRAY-uttryck –
UPDATE monthly_savings SET saving_per_quarter = ARRAYWHERE name = 'Manisha';
Sökning av matriser
Ett exempel på sökning av matriser visas nedan.
SELECT * FROM monthly_savings WHERE saving_per_quarter = 10000 ORsaving_per_quarter = 10000 ORsaving_per_quarter = 10000 ORsaving_per_quarter = 10000;
Om matrisens storlek är känd kan den sökmetod som anges ovan användas. Annars visar följande exempel hur man söker när storleken inte är känd.
SELECT * FROM monthly_savings WHERE 10000 = ANY (saving_per_quarter);
Composite Types
Denna typ representerar en lista med fältnamn och deras datatyper, dvs, struktur för en rad eller post i en tabell.
Deklaration av sammansatta typer
Följande exempel visar hur man deklarerar en sammansatt typ
CREATE TYPE inventory_item AS ( name text, supplier_id integer, price numeric);
Denna datatyp kan användas i skapa tabeller enligt nedan –
CREATE TABLE on_hand ( item inventory_item, count integer);
Inmatning av sammansatta värden
Sammansatta värden kan sättas in som en bokstavskonstant, genom att omsluta fältvärdena inom parenteser och separera dem med kommatecken. Ett exempel visas nedan –
INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);
Detta gäller för inventory_item som definieras ovan. Nyckelordet ROW är faktiskt valfritt så länge du har mer än ett fält i uttrycket.
Accessing Composite Types
Om du vill komma åt ett fält i en sammansatt kolumn använder du en punkt följt av fältnamnet, ungefär som när du väljer ett fält från ett tabellnamn. Om du till exempel vill välja några delfält från vår exempeltabell on_hand skulle frågan se ut som nedan –
SELECT (item).name FROM on_hand WHERE (item).price > 9.99;
Du kan till och med använda tabellnamnet också (till exempel i en flerstegsfråga), som här –
SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;
Rangtyper
Rangtyper representerar datatyper som använder ett intervall av data. Intervalltyper kan vara diskreta intervall (t.ex. alla heltalsvärden 1 till 10) eller kontinuerliga intervall (t.ex, alla tidpunkter mellan 10:00 och 11:00).
Den byggda-tillgängliga inbyggda intervalltyper inkluderar följande intervall –
-
int4range – Range of heltal
-
int8range – Range of bigint
-
numrange – Range of numeric
-
tsrange – Range of numeric
-
tsrange – Område för tidsstämpel utan tidszon
-
tstzrange – Område för tidsstämpel med tidszon
-
daterange – Område för datum
Anpassade intervalltyper kan skapas för att göra nya typer av intervall tillgängliga, till exempel IP-adressintervall som använder inet-typen som bas eller float-intervall som använder float-datatypen som bas.
Rangtyper har stöd för inkluderande och exklusiva intervallgränser med hjälp av tecknen och ( ). Exempelvis representerar ’[4,9)’ alla heltal från och med 4 till och med 9.
Objektidentifieringstyper
Objektidentifierare (OID) används internt av PostgreSQL som primära nycklar för olika systemtabeller. Om WITH OIDS anges eller om konfigurationsvariabeln default_with_oids är aktiverad är det endast då som OID:er i sådana fall läggs till i användarskapade tabeller. I följande tabell listas flera aliastyper. Aliastyperna för OID har inga egna operationer förutom specialiserade rutiner för in- och utdata.
Namn | Beskrivning | Värde Exempel | ||
---|---|---|---|---|
oid | any | numerisk objektidentifierare | 564182 | |
regproc | pg_proc | funktionsnamn | sum | |
regförfarande | pg_proc | funktion med argumenttyper | sum(int4) | |
regoper | pg_operator | operatornamn | + | |
regoperator | pg_operator | operator med argumenttyper | *(heltal,heltal) eller -(NONE,heltal) | |
regclass | pg_class | relationsnamn | pg_type | |
regtype | pg_type | datatypnamn | integer | |
regconfig | pg_ts_config | konfiguration för textsökning | English | |
regdictionary | pg_ts_dict | textsökningsordbok | simple | simple |
Pseudotyper
PostgreSQLs typsystem innehåller ett antal special-ändamål som kollektivt kallas pseudotyper. En pseudotyp kan inte användas som en kolumndatatyp, men den kan användas för att deklarera en funktions argument- eller resultattyp.
Tabellen nedan listar de befintliga pseudotyperna.
S. Nr. | Namn & Beskrivning |
---|---|
1 |
any Indikerar att en funktion accepterar en valfri indatatyp. |
2 |
anyelement Indikerar att en funktion accepterar vilken datatyp som helst. |
3 |
anyarray Indikerar att en funktion accepterar vilken array som helst. |
4 |
anynonarray Indikerar att en funktion accepterar alla datatyper som inte är arrayer. |
5 |
anyenum Indikerar att en funktion accepterar alla datatyper som inte är enum. |
6 |
anyrange Indikerar att en funktion accepterar alla datatyper i intervallet. |
7 |
cstring Indikerar att en funktion accepterar eller returnerar en C-sträng med nollterminering. |
8 |
internal Anger att en funktion accepterar eller returnerar en serverintern datatyp. |
9 |
language_handler En procedurspråkskallhanterare deklareras för att returnera language_handler. |
10 |
fdw_handler En handläggare av främmande data är deklarerad för att returnera fdw_handler. |
11 |
record Identifierar en funktion som returnerar en ospecificerad radtyp. |
12 |
trigger En triggerfunktion deklareras att returnera trigger. |
13 |
void Indikerar att en funktion inte returnerar något värde. |