Tutti i tipi di dato comuni per colonne PostgreSQL, raggruppati per famiglia: numeri interi, decimali, testo, tempo, booleani e UUID, JSON, indirizzi di rete, tipi compositi e tipi da estensione. Ogni riga mostra cosa memorizza il tipo e quando sceglierlo.
PostgreSQL ha decine di tipi, ma la progettazione quotidiana degli schemi ne usa un insieme ristretto. Le scelte ricorrenti sono: integer contro numeric per i numeri, varchar contro text per le stringhe (text di solito va bene), timestamp contro timestamptz (preferisci timestamptz per qualsiasi momento del mondo reale) e json contro jsonb (preferisci jsonb, è binario e indicizzabile). Scegli il tipo più specifico che comunque rientra nei limiti; il database lo fa rispettare al posto tuo.
Tabella di riferimento · 46 voci
Tipi di dati di PostgreSQLExplained
46 of 46 rows
Numeri interi
Intero a 2 byte da -32768 a 32767.
Raro; solo quando serve risparmiare spazio.
Intero a 4 byte, circa più/meno 2 miliardi.
La colonna predefinita per i numeri interi.
Intero a 8 byte, circa più/meno 9 trilioni.
Contatori molto grandi o ID esterni.
Intero a 4 byte a incremento automatico.
Chiavi numerate automaticamente del passato; da PG 10 GENERATED AS IDENTITY è la sostituzione consigliata.
Le varianti a 2 e 8 byte di serial.
Numerazione automatica abbinata a una colonna smallint o bigint.
Un intero che la tabella genera per te (GENERATED ALWAYS AS IDENTITY).
Il serial moderno; standard SQL e più sicuro contro gli insert manuali.
Decimali e a virgola mobile
Decimali esatti a precisione arbitraria.
Denaro e tutto ciò per cui gli errori di arrotondamento sono inaccettabili.
Float a precisione singola a 4 byte.
Valori scientifici approssimati in cui la precisione non è critica.
Float a precisione doppia a 8 byte.
Geospaziale, statistiche e valori di feature per il ML.
Un importo in valuta con una locale fissa.
Raramente; numeric con un codice valuta lato applicazione è più portabile.
Testo
Testo a lunghezza fissa, riempito di spazi.
Codici di larghezza nota; raramente necessario.
Testo a lunghezza variabile con un limite opzionale.
Stringhe limitate come username o email.
Testo a lunghezza variabile senza limiti di lunghezza.
La colonna stringa generica; nessuna penalità di prestazioni rispetto a varchar.
Tempo
Una data di calendario senza ora del giorno.
Compleanni e scadenze.
Un'ora del giorno, con o senza fuso orario.
Sveglie giornaliere or orari di negozio.
Data e ora senza fuso orario.
Schemi legacy; da evitare per il lavoro nuovo.
Data e ora memorizzate come UTC, mostrate nel fuso del client.
La scelta predefinita per qualsiasi momento reale; preferiscilo a timestamp.
Un intervallo di tempo, come 2 giorni o 3 ore.
Durate e aritmetica delle date.
Booleani, UUID e byte
Vero o falso.
Flag e interruttori.
Identificatore universalmente unico a 128 bit.
ID non sequenziali sicuri da esporre (generali nell'app o con gen_random_uuid).
Byte binari grezzi.
Blob, immagini e payload opachi; per i file grandi preferisci l'object storage.
Stringhe di bit a lunghezza fissa o variabile.
Flag compressi e campi di protocollo; un singolo valore on/off resta boolean.
JSON e semistrutturati
JSON analizzato in una forma binaria indicizzabile.
Dati flessibili o annidati; la colonna JSON consigliata (supporta indici GIN).
JSON conservato come testo originale.
Raro; solo quando serve preservare l'ordine delle chiavi o gli spazi esatti.
Testo XML.
Integrazioni legacy che richiedono XML.
Un'espressione path compilata per navigare dati JSON.
Filtrare dentro jsonb con jsonb_path_query e gli operatori SQL/JSON.
Rete e ricerca
Un indirizzo host IPv4 o IPv6.
Memorizzare IP di client o server.
Un blocco di rete IP, come 10.0.0.0/24.
Regole firewall e intervalli di subnet.
Un indirizzo MAC a 6 o 8 byte (EUI-64).
Identificatori di dispositivi e interfacce di rete.
Testo pre-elaborato per la ricerca full-text.
La ricerca integrata di Postgres prima di passare a un motore di ricerca separato.
Termini di ricerca combinati con operatori AND, OR e di prefisso.
La metà query della ricerca full-text, confrontata con un tsvector tramite @@.
Una posizione del write-ahead log, il numero di sequenza del log.
Monitoraggio del lag di replica e dei backup.
Compositi e avanzati
Un array di qualsiasi tipo base, es. integer[].
Liste di valori semplici; passa a una tabella figlia quando gli elementi richiedono colonne proprie.
Un valore da un elenco fisso che definisci tu.
Campi di stato con un insieme stabile di opzioni.
Un tipo riga personalizzato composto da più campi.
Gruppi di campi ricorrenti condivisi tra tabelle.
Un intervallo continuo tra due estremi.
Schedulazioni, fasce di prezzo e intervalli di versioni, con operatori di sovrapposizione.
Un tipo base avvolto in vincoli che definisci tu.
Regole riutilizzabili come un'email non vuota, applicate a ogni colonna che la usa.
Una riga senza nome di valori tipizzati.
Valori restituiti da funzioni PL/pgSQL e risultati intermedi di query.
Valori geometrici bidimensionali integrati.
Geometria piana semplice; le posizioni del mondo reale richiedono PostGIS.
Un identificatore di oggetto di sistema a 4 byte senza segno.
Join tra cataloghi di sistema; non per colonne applicative.
Una stringa interna di identificatore a 63 caratteri.
Query sui cataloghi; text normale per tutto ciò che l'utente vede.
Tipi da estensione
Coppie chiave/valore stringa in un singolo valore (estensione).
Mappe piatte; oggi jsonb le copre meglio.
Un percorso di etichette gerarchico come news.tech.ai (estensione).
Alberi con query su antenati e discendenti.
Testo che confronta senza distinzione tra maiuscole e minuscole (estensione).
Unicità case-insensitive come le email, senza indice su lower().
Oggetti geografici e geometrici dall'estensione PostGIS.
Query di distanza, contenimento e indice spaziale.
Funzioni di estensione che generano valori UUID.
Generazione legacy; da PG 13 gen_random_uuid() è integrata.