Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Tipi di Dato
PrecedenteQuery WITHTipi MonetariSuccessivo

8. Tipi di Dato

PostgreSQL™ ha un corposo insieme tipi di dato nativi disponibili per gli utenti. Gli utenti possono aggiungere nuovi tipi a PostgreSQL™ utilizzando il comando ???.

La Tabella 8.1, «Tipi di Dato» visualizza tutti i tipi dati di uso generale incorporati. La maggior parte dei nomi alternativi elencati nella colonna «Alias» sono i nomi usati internamente da PostgreSQL™ per ragioni storiche. In aggiunta, sono disponibili altri tipi usati internamente o deprecati, ma non sono elencati quì.

Tabella 8.1. Tipi di Dato

NomeAliasDescrizione
bigintint8intero con segno a 8 byte
bigserialserial8intero auto incrementale a 8 byte
bit [ (n) ] stringa di bit a lunghezza fissa
bit varying [ (n) ]varbitstringa di bit a lunghezza variabile
booleanboolvalore Booleano (vero/falso)
box Un rettangolo su un piano
bytea dato binario («array di byte»)
character varying [ (n) ]varchar [ (n) ]stringa di caratteri a lunghezza variabile
character [ (n) ]char [ (n) ]stringa di caratteri a lunghezza fissa
cidr indirizzo di rete IPv4 o IPv6
circle cerchio su un piano
date data di calendario (anno, mese, giorno)
double precisionfloat8numero a virgola mobile a doppia precisione (8 bytes)
inet indirizzo di host IPv4 or IPv6
integerint, int4intero con segno a 4 byte
interval [ fields ] [ (p) ] intervallo di tempo
line linea infinita su un piano
lseg segnmento di linea su un piano
macaddr indirizzo MAC (Media Access Control)
money somma di denaro
numeric [ (p, s) ]decimal [ (p, s) ]numerico di precisione selezionabile
path tracciato geometrico su un piano
point punto geometrico su un piano
polygon tracciato chiuso su un piano
realfloat4numero a virgola mobile a precisione singola (4 byte)
smallintint2intero con segno a 2-byte
serialserial4intero autoincrementale a 4-byte
text stringa di caratteri a lunghezza variabile
time [ (p) ] [ without time zone ] orario del giorno (senza fuso orario)
time [ (p) ] with time zonetimetzorario del giorno, incluso il fuso orario
timestamp [ (p) ] [ without time zone ] data e orario (senza fuso orario)
timestamp [ (p) ] with time zonetimestamptzdata e orario, includo il fuso orario
tsquery query di ricerca di testo
tsvector documento di ricerca testo
txid_snapshot istantanea di transaction ID a livello utente
uuid identificatore unico universalmente
xml dati XML

[Nota]

Compatibilità

[Nota]

Nota

Nota per il revisore: spellings thereof?

I seguenti tipi (or spellings thereof) sono specificati dall'SQL: bigint, bit, bit varying, boolean, char, character varying, character, varchar, date, double precision, integer, interval, numeric, decimal, real, smallint, time (con o senza fuso orario), timestamp (con o senza fuso orario), xml.

Ogni tipo dato ha una rappresentazione esterna determinata dalle sue funzioni di input e output. Molti dei tipi incorporati hanno formati esterni evidenti. Tuttavia, diversi tipi o sono unici a PostgreSQL™, come i percorsi geometrici, o hanno molte più possibilità di formattazione, come i tipi data e ora. Alcune delle funzioni di input e output non sono invertibili. Cioè il risultato di una funzione di output potrebbe perdere precisione quando confrontato al input originale.

8.1. Tipi Numerici

I tipi numerici consistono di numeri interi di due, quattro, e otto byte, di numeri in virgola mobile di quattro e otto byte, e di numeri decimali con precisione selezionabile. La Tabella 8.2, «Tipi Numerici» elenca i tipi disponibili.

Tabella 8.2. Tipi Numerici

NomeDimensioneDescrizioneEstensione
smallint2 byteinteri con piccola estensione-32768 to +32767
integer4 bytela scelta comune per gli interi-2147483648 to +2147483647
bigint8 byteinteri ad elevata estensione-9223372036854775808 to 9223372036854775807
decimalvariableesatta, precisione specificata dall'utentesenza limite
numericvariableesatta, precisione specificata dall'utentesenza limite
real4 byteinesatta, precisione variabile6 cifre decimali di precisione
double precision8 byteinesatta, precisione variabile15 cifre decimali di precisione
serial4 byteintero autoincrementanteda 1 a 2147483647
bigserial8 byteintero autoincrementante grandeda 1 a 9223372036854775807

La sintassi delle costanti per i tipi numerici è descritta in Sezione 4.1.2, «Costanti». I tipi numerici hanno un insieme completo di corrispondenti operatori aritmetici e funzioni. Riferirsi al Capitolo 9, Funzioni e Operatori per ulteriori informazioni. La sezione seguente descrive i tipi in dettaglio.

8.1.1. Tipi Interi

I tipi smallint, integer, e bigint memorizzano numeri interi, che significa, numeri senza componente frazionale, di diversa estensione. Tentativi di memorizzare valori al di fuori dell'estensione consentita provocheranno un errore.

Il tipo integer è quello scelto normalmente, dato che offre il migliore bilanciamento tra estensione, dimensione di memorizzazione e prestazione. Il tipo smallint è generalmente usato solo se lo spazio nel disco è ridotto. Il tipo bigint dovrebbe essere usato solo se l'estensione del tipo integer non è sufficiente, in quanto quest'ultimo è certamente più veloce.

Il tipo bigint può non funzionare correttamente su tutte le piattaforme, dato che richiede sul compilatore un supporto per interi a otto byte. Su una macchina senza tale supporto, bigint si comporta come integer (ma occupa ugualmente otto byte di memorizzazione). Tuttavia, non siamo informati di alcuna piattaforma sui cui si sia presentato questo caso.

SQL specifica solo i tipi interi integer (o int), smallint, e bigint. I tipi chiamati int2, int4, e int8 sono estensioni, che sono condivise con diversi altri sistemi di database SQL.

8.1.2. Numeri a Precisione Arbitraria

Il tipo numeric può memorizzare numeri di precisione fino a 1000 cifre ed effettuare i calcoli esattamente. È raccomandato specialmente per memorizzare quantità monetarie e altre quantità dove viene richiesta precisione. Tuttavia, l'aritmetica su valori numeric è molto lenta confrontata con i tipi interi, o con i tipi in virgola mobile descritti nella prossima sezione.

In ciò che segue vengono utilizzati questi termini: La scala di un numeric è il conto delle delle cifre decimali nella parte frazionaria, alla destra del punto decimale. La precisione di un numeric è il conto totale delle cifre significative nell'intero numero, cioè, il numero di cifre in ambedue i lati del punto decimale. Per cui il numero 23.5141 ha una precisione di 6 e una scala di 4. Gli interi possono essere considerati come aventi una scala zero.

In una colonna numeric possono essere configurati sia la massima precisione che la massima scala. Per dichiarare una colonna di tipo numeric usare la sintassi:

NUMERIC(precision, scale)

La precisione deve essere positiva,la scala zero o positiva. Alternativamente:

NUMERIC(precision)

seleziona una scala di 0. Specificare:

NUMERIC

senza nessuna precisione o scala crea una colonna in cui possono essere memorizzati valori di qualsiasi precisione e scala, fino al limite di implementazione della precisione. Una colonna di questo tipo non forzerà i valori in ingresso ad una particolare scala, mentre le colonne numeric con una scala dichiarata forzeranno i valori in ingresso a quella scala. (Lo standard SQL richiede un valore predefinito di 0 per la scala, cioè forza la precisione a intero. Considerare questo un tantino inutile. Se siete preoccupati per la portabilità, specificare esplicitamente la precisione e la scala).

Se la scala di un valore da memorizzare è più grande della scala dichiarata della colonna, il sistema arrotonderà il valore al numero dichiarato di cifre decimali. Se invece il numero di cifre alla sinistra del punto decimale supera la precisione dichiarata meno la scala dichiarata, viene generato un errore.

I valori numerici vengono fisicamente memorizzati senza zeri non significativi e senza zeri finali. Quindi, la precisione e la scala dichiarate per una colonna sono massime, non allocazioni fisse. (In questo senso il tipo numeric è più simile al varchar(n) che al char(n)). La richiesta reale di memoria è di due byte per ogni gruppo di quattro cifre decimali, più da cinque a otto byte in testa.

In aggiunta ai valori numerici normali, il tipo numeric ammette il valore speciale NaN, che significa «not-a-number» (non-un-numero). Ogni operazione su NaN restituisce un altro NaN. Quando si scrive questo valore come una costante in un comando SQL, bisogna racchiuderlo tra apici, per esempio UPDATE tabella SET x = 'NaN'. In ingresso, la stringa NaN viene riconosciuta senza distinzione tra maiuscole e minuscole.

[Nota]

Nota

Nella maggior parte delle implementazioni del concetto «not-a-number», NaN non è considerato uguale a nessun altro valore numerico (NaN compreso). Per consentire che i valori numeric siano ordinati e usati negli indici B-tree, PostgreSQL™ tratta i valori NaN come uguali, e maggiori di tutti i valori non-NaN.

I tipi decimal e numeric sono equivalenti. Ambedue fanno parte dello standard SQL.

8.1.3. Tipi a Virgola Mobile

I tipi di dato real e double precision sono tipi numerici inesatti, con precisione variabile. In pratica, questi tipi sono normalmente implementazioni dello standard IEEE 754 per l'Aritmetica Binaria a Virgola-Mobile (rispettivamente a singola e doppia precisione), nella misura in cui i sottostanti processore, sistema operativo e compilatore li supportano.

Inesatto significa che alcuni valori non possono essere convertiti esattamente al formato interno e vengono memorizzati con approssimazione, per cui la memorizzazione e la stampa tirata fuori potrebbero mostrare lievi discrepanze. La gestione di questi errori e della loro propagazione attraverso i calcoli è il soggetto di una intera branca della matematica e della scienza del computer e non sarà quì ulteriormente discussa, tranne che per i seguenti punti:

  • Se si richiedono esatte memorizzazione e calcoli (come per gli importi monetari), usare invece il tipo numeric.

  • Se si vogliono fare calcoli complicati con questi tipi per niente di importante, specialmente se si basano su alcuni comportamenti in casi limite (infinito, underflow), bisogna valutarne attentamente l'implementazione.

  • Il confronto di due valori in virgola mobile per l'uguaglianza, non è detto che debba funzionare come ci si attende.

Sulla maggior parte delle piattaforme, il tipo real ha una estensione di almeno da 1E-37 a 1E+37 con una precisione di almeno 6 cifre decimali. Il tipo double precision normalmente ha una estensione di circa da 1E-307 a 1E+308 con una precisione di almeno 15 cifre. Valori troppo grandi o troppo piccoli causeranno un errore. Se la precisione di un numero in ingresso è troppo alta, si potrà verificare un arrotondamento. Numeri troppo prossimi a zero che non sono rappresentabili come diversi da zero possono causare un errore di underflow.

In aggiunte ai valori numerici ordinari, i tipi in virgola mobile hanno alcuni valori speciali:


Infinity
-Infinity
NaN

Questi rappresentano rispettivamente i valori speciali IEEE 754 «infinito», «infinito negativo», e «non-un-numero». (Su una macchina la cui aritmetica in virgola mobile non segue lo IEEE754, molto probabilmente non lavoreranno come ci si aspetta). Quando si scrivono questi valori come costanti in un comando SQL, bisogna racchiuderli tra apici, per esempio UPDATE tabella SET x = 'Infinity'. In ingresso le stringhe vengono riconosciute senza distinzione tra maiuscole e minuscole.

[Nota]

Nota

IEEE754 specifica che NaN non dovrebbe essere uguale a qualsiasi altro valore in virgola mobile (NaN compreso). Per consentire che i valori in virgola mobile siano ordinati e usati in indici B-tree, PostgreSQL™ tratta i valori NaN come uguali, e maggiori di tutti i valori non-NaN.

PostgreSQL™ also supports the SQL-standard notations float and float(p) for specifying inexact numeric types. Here, p specifies the minimum acceptable precision in binary digits. PostgreSQL™ accepts float(1) to float(24) as selecting the real type, while float(25) to float(53) select double precision. Values of p outside the allowed range draw an error. float with no precision specified is taken to mean double precision.

[Nota]

Nota

Prima di PostgreSQL™ 7.4, la precisione nei float(p) era considerata essere di molte cifre decimali. Questo è stato corretto per uniformarsi allo standard SQL, il quale specifica che la precisione viene misurata in cifre binarie. Il presupposto che real e double precision abbiano nella mantissa, rispettivamente, esattamente 24 e 53 bit è corretto per lo standard IEEE nell'implementazione in virgola mobile. Sulle piattaforme non-IEEE potrebbe essere leggermente diverso, ma per semplicità viene utilizzata la stessa estensione di p su tutte le piattaforme.

8.1.4. Tipi Serial

I tipi di dato serial e bigserial non sono veri tipi, ma soltanto una convenzione simbolica per impostare identificatori unici di colonne (in maniera simile alla proprietà AUTO_INCREMENT supportata da alcuni altri database). Nell'implementazione corrente, specificare:

CREATE TABLE tablename (
    colname SERIAL
);

è equivalente a specificare:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

Così, è stata creata una colonna integer e gli sono stati impostati i valori predefiniti che verranno assegnati da un generatore di sequenza. È stato applicato un vincolo NOT NULL per essere sicuri che non venga, altrimenti, inserito esplicitamente un valore null. (Nella maggior parte dei casi si vorrà anche inserire un vincolo UNIQUE o PRIMARY KEY per impedire l'inserimento accidentale di valori duplicati, ma questo non è automatico). Infine, la sequenza è contrassegnata «owned by» la colonna, in modo che potrà essere eliminata se la colonna o la tabella vengono eliminate.

[Nota]

Nota

Prima di PostgreSQL™ 7.3, serial sottintendeva UNIQUE. Questo non è più automatico. Se si vuole che una colonna serial abbia un vincolo unique o una chiave primaria, bisognerà specificarlo, come con qualsiasi altro tipo di dato.

Per inserire nella colonna serial il successivo valore di sequenza, specificare che alla colonna serial dovrà essere assegnato il suo valore predefinito. Questo può essere fatto o escludendo la colonna dalla lista di colonne nell'istruzione INSERT, o tramite l'uso della parola chiave DEFAULT.

I tipi chiamati serial e serial4 sono equivalenti: ambedue creano colonne integer. I tipi chiamati bigserial e serial8 lavorano anch'essi nello stesso modo, eccetto che essi creano una colonna bigint. Il tipo bigserial dovrà essere usato solo se si prevede di usare un numero di identificatori maggiore di 231 nel corso della durata della tabella.

La sequenza creata per una colonna serial viene automaticamente eliminata quando viene eliminata la colonna proprietaria. Si potrà eliminare la sequenza senza eliminare la colonna, ma questo forzerà la rimozione dell'espressione predefinita della colonna.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Tipi di Dato
PrecedenteQuery WITHTipi MonetariSuccessivo