Tipi di dati numerici: INTEGER, NUMERIC, FLOAT
Oggi parliamo dei tipi di dati numerici in PostgreSQL. Se ti sei mai chiesto come salvare il numero "42", fare calcoli finanziari o magari gestire i millisecondi, sei nel posto giusto. Vediamo insieme quale tipo usare per ogni situazione, così tu e i tuoi dati starete sempre comodi.
I tipi di dati numerici in PostgreSQL si dividono in tre gruppi principali:
- Numeri interi (
INTEGER): per salvare numeri senza parte decimale. Sono i classici numeri tipo 1, 42, -7. - Numeri esatti (
NUMERIC): per salvare numeri con un numero fisso di cifre decimali. Utile per i calcoli finanziari, dove la precisione conta più della vita stessa. - Numeri a virgola mobile (
REAL): per numeri che possono essere enormi o minuscoli. Sono meno precisi diNUMERIC, ma perfetti per i calcoli scientifici.
Tipo INTEGER
INTEGER è il tipo di dato per i numeri interi. Va bene quando devi salvare numeri senza parte decimale. PostgreSQL offre ben tre varianti di INTEGER per coprire diversi range:
SMALLINT: tipo intero piccolo. Range: da -32.768 a 32.767.INTEGER(oINT): tipo intero standard. Range: da -2.147.483.648 a 2.147.483.647.BIGINT: per numeri grandi. Range: da -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807.
Immagina di avere una tabella students dove salvi info sugli studenti: il loro nome, età e il numero di crediti (punti accademici):
| id | name | age | credits |
|---|---|---|---|
| 1 | Otto Nate | 21 | 30 |
| 2 | Maria Chi | 22 | 45 |
| 3 | Peter Val | 20 | 60 |
| 4 | Anna Song | 23 | 50 |
| 5 | Sophie Zhang | 21 | 35 |
Ora facciamo una semplice query SQL per ottenere la lista degli studenti con la loro età e i crediti:
SELECT name, age, credits
FROM students;
Risultato:
| name | age | credits |
|---|---|---|
| Otto Nate | 21 | 30 |
| Maria Chi | 22 | 45 |
| Peter Val | 20 | 60 |
| Anna Song | 23 | 50 |
| Sophie Zhang | 21 | 35 |
Quando usare INTEGER?
- Per salvare identificatori (
id, numero ordine). - Per salvare quantità di qualcosa (tipo il numero di prodotti in magazzino, numero di studenti).
Tipo NUMERIC
NUMERIC è il tipo di dato per numeri esatti con la virgola fissa. Se devi salvare qualcosa tipo 123.456 e un errore su una cifra decimale ti costa la reputazione (o i soldi), usa NUMERIC.
Formato dichiarazione: NUMERIC(precision, scale), dove:
precision— numero totale di cifre (sia prima che dopo la virgola).scale— numero di cifre dopo la virgola.
Per esempio, NUMERIC(6, 2) ti permette di salvare numeri con massimo 6 cifre, di cui 2 dopo la virgola.
Creiamo una tabella per tracciare le transazioni finanziarie:
| id | description | amount |
|---|---|---|
| 1 | Pagamento per lo studio | 2345.67 |
| 2 | Borsa di studio mensile | 500.00 |
| 3 | Tassa laboratorio | 145.99 |
| 4 | Multa biblioteca | 12.75 |
| 5 | Registrazione conferenza | 320.50 |
Ora mostriamo la lista delle transazioni:
SELECT description, amount
FROM transactions;
Risultato:
| description | amount |
|---|---|
| Pagamento per lo studio | 2345.67 |
| Borsa di studio mensile | 500.00 |
| Tassa laboratorio | 145.99 |
| Multa biblioteca | 12.75 |
| Registrazione conferenza | 320.50 |
Quando usare NUMERIC?
- Calcoli finanziari (prezzo prodotti, stipendi).
- Salvare misurazioni precise (peso, lunghezza).
Tabella measurements
| id | mass - REAL | height - REAL |
|---|---|---|
| 1 | 70.5 | 1.83 |
| 2 | 64.2 | 1.75 |
| 3 | 82.3 | 1.92 |
| 4 | 55.0 | 1.60 |
Ora mostriamo i valori:
SELECT mass, height
FROM measurements;
Risultato:
| mass | height |
|---|---|
| 70.5 | 1.83 |
| 64.2 | 1.75 |
| 82.3 | 1.92 |
| 55.0 | 1.60 |
Quando usare REAL?
- Calcoli scientifici (massa degli atomi, distanza dalla Luna).
- Simulazioni dati dove qualche errore è ok.
Confronto tipi numerici: quando usare cosa?
| Tipo di dato | Range | Precisione | Esempi d'uso |
|---|---|---|---|
SMALLINT |
-32.768 a 32.767 | Numeri interi | Numeri piccoli (età, rating). |
INTEGER |
-2.147.483.648 a 2.147.483.647 | Numeri interi | Identificatori, quantità. |
BIGINT |
-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 | Numeri interi | Numeri davvero grandi. |
NUMERIC |
Dipende da precision e scale |
Numeri decimali esatti | Finanza, misurazioni. |
REAL |
Circa 6 cifre decimali | Virgola mobile | Dati approssimativi o scientifici. |
DOUBLE PRECISION |
Circa 15 cifre decimali | Virgola mobile ad alta precisione | Scienza, ricerca. |
Alias
In PostgreSQL molti tipi numerici hanno alias (sinonimi): sono nomi alternativi per i tipi che si comportano allo stesso modo, ma migliorano la leggibilità o la compatibilità con altri DBMS.
Ecco una guida veloce e chiara agli alias dei tipi numerici in PostgreSQL:
Alias per tipi interi
| Alias | Tipo reale | Dimensione | Range |
|---|---|---|---|
INT |
INTEGER |
4 byte | −2.147.483.648 a 2.147.483.647 |
INT4 |
INTEGER |
4 byte | (alias vecchio) |
SMALLINT |
SMALLINT |
2 byte | −32.768 a 32.767 |
INT2 |
SMALLINT |
2 byte | |
BIGINT |
BIGINT |
8 byte | −9 quintilioni a +9 quintilioni |
INT8 |
BIGINT |
8 byte |
Alias per numeri esatti
| Alias | Tipo reale | Uso |
|---|---|---|
DEC |
NUMERIC |
Sinonimo secondo lo standard SQL |
DECIMAL |
NUMERIC |
Stessa cosa |
Alias per numeri a virgola mobile
| Alias | Tipo reale | Precisione |
|---|---|---|
FLOAT |
DOUBLE PRECISION |
~15 cifre (default) |
FLOAT(24) |
REAL |
~6 cifre |
FLOAT(53) |
DOUBLE PRECISION |
~15 cifre |
FLOAT8 |
DOUBLE PRECISION |
Alias vecchio |
FLOAT4 |
REAL |
Alias vecchio |
Errori tipici
Lavorando con i tipi numerici, puoi incappare in qualche trappola:
Scegliere un tipo di dato troppo piccolo. Se per l'età delle persone usi SMALLINT, sbagli. Il robot di "Matrica", che ha milioni di anni, ci rimane male.
Perdita di dati per arrotondamento. Se usi REAL per i calcoli finanziari, rischi di perdere i centesimi. E poi anche la fiducia dei clienti.
Confronto tra tipi diversi. Se confronti INTEGER e REAL, puoi avere risultati strani per via di come sono rappresentati i numeri a virgola mobile.
GO TO FULL VERSION