Tipi di dati SQL: guida essenziale per principianti
Padroneggia i tipi di dati SQL in MySQL, PostgreSQL e SQL Server. Scopri come scegliere i formati numerici, di testo e di data giusti per ottimizzare prestazioni e integrità dei dati.
Quando inizi a lavorare con SQL, è facile pensare ai tipi di dati come a semplici etichette. Una singola colonna memorizza numeri, testo, date o tipi di dati speciali. Ma un tipo di dato è più di un'etichetta: è un insieme di regole che definisce cosa sia un valore agli occhi del database.
In pratica, i tipi di dati plasmano il modo in cui SQL “comprende” le informazioni nel tuo database. Sono un insieme di istruzioni che forniscono a SQL il contesto necessario per leggere, confrontare ed elaborare i tuoi dati in modo accurato.
In questo tutorial vedremo le principali categorie di tipi di dati SQL e come si comportano nei diversi sistemi di gestione dei database. Ti invito a seguire gli esempi lungo il percorso.
Se non hai molta esperienza con le tabelle di database, il nostrocorso SQL Fundamentals offre basi chiare e adatte ai principianti per capire come sono strutturati dataset come questo.
Cosa sono i tipi di dati SQL?
Un tipo di dato descrive il formato dei tuoi dati: i valori che una colonna può contenere, come vengono archiviati internamente e quali operazioni hanno senso eseguirci sopra.
Questo significa che la scelta del tipo di dato incide su molto più del solo design della tabella. Può influenzare esigenze di archiviazione, prestazioni delle query, comportamento dell’ordinamento, operazioni matematiche e perfino come sistemi diversi interpretano lo stesso valore.
Ecco una tabella semplice che usa diversi tipi contemporaneamente:
CREATETABLE employees (
id INT,
name VARCHAR(50),
start_date DATE,
active BOOLEAN,
salary DECIMAL(10,2));Offerto da
Ogni colonna in questa tabella definisce il tipo di dati che può contenere.
La colonna id memorizzerà numeri interi, assegnando a ciascun dipendente un identificatore univoco.
La colonna name può contenere fino a 50 caratteri di testo, così da archiviare nomi brevi.
La colonna start_date è per le date di calendario.
La colonna active memorizzerà valori vero o falso, rendendo semplice tracciare quali dipendenti sono attualmente attivi.
Infine, la colonna salary memorizzerà importi monetari con una precisione di 10 cifre, mantenendo due cifre decimali per i centesimi.
Insieme, queste colonne formano una tabella strutturata che applica regole sui tipi di valori consentiti in ciascun campo. Questo rende i dati più prevedibili e facili da usare.
Aggiungiamo alcuni dati di esempio e vediamo come potrebbe apparire la tabella risultante, usando PostgreSQL.
Sistemi di database diversi seguono gli stessi principi ma variano in nomi e funzionalità. Per esempio, SQL Server usa BIT invece di BOOLEAN e MySQL tratta BOOLEAN come un intero piccolo.
Categorie di tipi di dati SQL
Ci sono quattro categorie principali di tipi di dati: numerici, carattere, data e speciali. Vediamole nel dettaglio.
Tipi di dati numerici
I tipi numerici memorizzano numeri interi o decimali. Il tipo numerico specifico determina l'intervallo, la precisione e la dimensione di archiviazione dei numeri memorizzati. I tipi più comuni in questa categoria sono:
interi, come INT, SMALLINT e BIGINT, per numeri interi,
decimali, come DECIMAL(p, s) e NUMERIC(p, s), per valori decimali esatti,
e floating point, come FLOAT e DOUBLE, per valori approssimati che possono introdurre piccole differenze di arrotondamento
Creiamo una tabella di esempio per mostrare diversi tipi di dati numerici:
Come puoi vedere, la prima colonna è vincolata a un numero intero, la seconda a un decimale con due cifre dopo il punto, e la terza è un decimale con un numero indefinito di cifre.
A prima vista, DECIMAL e FLOAT possono sembrare uguali. Ma c’è una differenza importante: DECIMAL memorizza un numero preciso con un numero specificato di cifre decimali, mentre FLOAT mantiene un valore approssimato che può variare leggermente a seconda del sistema.
È importante usare i decimali quando la precisione è necessaria e affidarsi ai float solo se sono accettabili piccoli errori di arrotondamento.
Categoria
Tipo/i di dato
Scopo / Cosa memorizza
Valore/i di esempio
Numerico
INT, SMALLINT, BIGINT
Numeri interi di varie dimensioni
1, 42, 1000
Numerico
DECIMAL(p,s), NUMERIC(p,s)
Valori decimali esatti con precisione fissa
19.99, 250.56
Numerico
FLOAT, DOUBLE
Valori decimali approssimati. Possono introdurre piccole differenze di arrotondamento
3.1415, 2.71828
Tipi di dati carattere e stringa
I tipi carattere memorizzano testo. Ce ne sono diversi che differiscono per prestazioni ed efficienza di archiviazione.
CHAR(n) è per set di caratteri a lunghezza fissa. Utile per dati sempre della stessa dimensione, come codici di stato o sigle aeroportuali.
VARCHAR(n) è per set di caratteri a lunghezza variabile. Utile per nomi, indirizzi email e altro testo inserito dagli utenti.
TEXT e tipi simili sono usati per blocchi di testo non strutturato, come post di blog o descrizioni di prodotto.
Alcuni sistemi, come SQL Server, supportano anche stringhe Unicode, come NCHAR e NVARCHAR, utili quando i tuoi dati includono testi in più sistemi di scrittura, come latino, cinese o cirillico.
Categoria
Tipo/i di dato
Scopo / Cosa memorizza
Valore/i di esempio
Carattere / Stringa
CHAR(n)
Testo a lunghezza fissa
'US', 'CA'
Carattere / Stringa
VARCHAR(n)
Testo a lunghezza variabile
'Alice Johnson', 'Bob Smith'
Carattere / Stringa
TEXT
Grandi blocchi di testo non strutturato
'Contatto preferito via email.', 'Richiede copia della fattura per ogni ordine.'
Carattere / Stringa
NCHAR(n), NVARCHAR(n)
Testo Unicode a lunghezza fissa o variabile
'Å', 'É', 'München', 'São Paulo'
Vediamo come appare con una tabella di esempio che dimostra diversi tipi di stringa:
CREATETABLE customers (
id INT,
country_code CHAR(2),
name VARCHAR(100),
notes TEXT);INSERTINTO customers VALUES(1,'US','Alice Johnson','Preferred contact by email.'),(2,'CA','Bob Smith','Requires invoice copy for each order.');SELECT*FROM customers;Offerto da
Ecco come finirebbe per apparire questa tabella. Puoi vedere le differenze di lunghezza codificate in ciascun tipo di stringa.
id
country_code
name
notes
1
US
Alice Johnson
Preferred contact by email.
2
CA
Bob Smith
Requires invoice copy for each order.
Qui, CHAR(2) impone una lunghezza costante, mentre VARCHAR e TEXT consentono maggiore flessibilità.
Tipi di dati data e ora
I tipi di dati per data e ora consentono di memorizzare e interrogare in modo accurato le informazioni temporali. I principianti possono pensare di usare tipi numerici o stringhe per codificare questo tipo di informazioni. Tuttavia, ciò può causare problemi a valle con l’analisi dei dati. Usare un tipo di dato specifico per il calendario rende tutto più fluido.
I tre tipi più usati sono:
DATE, che codifica anno, mese e giorno,
TIME, che memorizza ora, minuto e secondo,
e DATETIME o TIMESTAMP, che memorizzano data e ora combinati.
I database moderni possono anche supportare secondi frazionari o tipi di dati con fuso orario, come TIMESTAMPTZ in PostgreSQL, che memorizza timestamp in UTC e li converte automaticamente nel fuso orario della tua sessione al recupero.
Categoria
Tipo/i di dato
Scopo / Cosa memorizza
Valore/i di esempio
Data / Ora
DATE
Date di calendario (anno, mese, giorno)
'2025-11-26'
Data / Ora
TIME
Orario del giorno (ora, minuto, secondo)
'09:30:00', '18:45:30'
Data / Ora
DATETIME, TIMESTAMP
Data e ora combinati
'2025-11-20 14:15:00', '2025-11-21 09:00:00'
Data / Ora
TIMESTAMPTZ
Data e ora con fuso orario (PostgreSQL)
'2025-11-21 09:00:00+00'
Creiamo una tabella semplice per demostrare questi tipi temporali:
CREATETABLE events (
event_id INT,
event_date DATE,
start_time TIME,
created_at DATETIME);INSERTINTO events VALUES(1,'2025-11-26','09:30:00','2025-11-20 14:15:00'),(2,'2025-12-01','18:45:30','2025-11-21 09:00:00');SELECT*FROM events;Offerto da
Ecco come la tabellaapparirebbe:
event_id
event_date
start_time
created_at
1
2025-11-26
09:30:00
2025-11-20 14:15:00
2
2025-12-01
18:45:30
2025-11-21 09:00:00
Puoi vedere come la scelta del tipo di data o timestamp giusto influisca sul tipo di dato che puoi memorizzare.
Booleani e altri tipi di dati speciali
Non tutti i tipi di dati rientrano perfettamente nelle categorie precedenti. Per questi, SQL include una serie di tipi speciali per casi d’uso specifici. Alcuni tra i più comuni che potresti incontrare includono:
Valori booleani (BOOLEAN, BOOL o BIT, a seconda del sistema) per registrare vero o falso,
Dati binari (BLOB) per immagini, file o oggetti serializzati,
Testo di grandi dimensioni (CLOB) per documenti completi,
JSON (in MySQL e PostgreSQL) per dati senza schema o annidati
ARRAY (solo in PostgreSQL) per liste
UUID per identificatori univoci che non si basano su sequenze numeriche, come un token di sessione o un codice di tracciamento globale.
I tipi speciali ti permettono di memorizzare dati più ricchi o flessibili quando le tabelle tradizionali da sole non catturano la struttura.
Categoria
Tipo/i di dato
Scopo / Cosa memorizza
Valore/i di esempio
Speciale / Booleano / Altro
BOOLEAN, BOOL, BIT
Valori vero o falso
TRUE, FALSE
Speciale / Booleano / Altro
BLOB
Oggetti binari di grandi dimensioni (immagini, file)
[binary image data]
Speciale / Booleano / Altro
CLOB
Documenti di testo di grandi dimensioni
'Testo integrale del contratto...'
Speciale / Booleano / Altro
JSON
Dati strutturati o annidati
'{"name": "Alice"}'
Speciale / Booleano / Altro
ARRAY
Liste di valori (solo PostgreSQL)
[1,2,3]
Speciale / Booleano / Altro
UUID
Identificatori unici globali
'550e8400-e29b-41d4-a716-446655440000'
Tipi di dati SQL nei diversi sistemi
I sistemi di gestione dei database differiscono nei dettagli di come usano questi tipi di dati. Sebbene le macro-categorie restino le stesse, nomi e comportamenti esatti variano tra i sistemi.
I diversi sistemi progettano i loro tipi di dati con priorità proprie, motivo per cui i comportamenti differiscono. Alcune differenze sono minime, come la parola chiave usata. Altre cambiano il comportamento pratico dei dati, come i limiti sulla lunghezza del testo, come vengono archiviati i booleani o se il sistema supporta formati specializzati.
MySQL enfatizza velocità e semplicità, quindi usa scelte pratiche e leggere come TINYINT (tecnicamente memorizzato come numeri) per i valori booleani. Favorisce prestazioni e ampia compatibilità rispetto a una semantica di tipo rigorosa.
PostgreSQL punta alla conformità agli standard e all’estensibilità. Ciò si riflette nell’uso di un vero tipo BOOLEAN e in un set più ricco di opzioni, come ARRAY e JSONB per memorizzare dati strutturati o annidati direttamente in una colonna.
SQL Server è pensato per prestazioni prevedibili in ambienti enterprise e un’integrazione profonda con l’ecosistema Microsoft. Per questo offre tipi fortemente definiti come BIT per i booleani e VARCHAR(MAX) per il testo di grandi dimensioni.
La tabella seguente mostra affiancati come tre grandi sistemi SQL implementano concetti comuni.
Concetto
MySQL
PostgreSQL
SQL Server
Numerico (numeri interi)
Usa INT per numeri interi generici
Usa INTEGER per numeri interi
Usa INT per numeri interi
Numeri decimali / a precisione fissa
Usa DECIMAL(p, s) per valori numerici precisi
Usa NUMERIC(p, s) per memorizzazione a precisione esatta
Usa DECIMAL(p, s) per valori numerici precisi
Stringhe di testo di lunghezza standard
Usa VARCHAR(n) per testo a lunghezza variabile
Usa VARCHAR(n) per testo a lunghezza variabile
Usa VARCHAR(n) per testo a lunghezza variabile
Archiviazione di testo lungo
Usa TEXT per campi di testo lunghi
Usa TEXT per campi di testo lunghi
Usa VARCHAR(MAX) per campi di testo lunghi
Valori booleani
Memorizza i booleani come TINYINT(1) (0 o 1)
Usa valori BOOLEAN nativi (true/false)
Usa BIT (0 o 1) per dati tipo booleano
Chiavi primarie auto-incrementali
Usa la parola chiave AUTO_INCREMENT
Usa SERIAL o IDENTITY per interi auto-generati
Usa IDENTITY per interi auto-generati
Stringhe di caratteri molto grandi
Usa LONGTEXT per testo estremamente grande
Consente VARCHAR molto grandi senza limite pratico
Usa VARCHAR(MAX) per testo grande o senza limiti
Archiviazione JSON
Supporta JSON per dati JSON strutturati
Supporta sia JSON (testo) che JSONB (ottimizzato binario)
Supporta JSON (memorizzato come testo)
Archiviazione di array
Non supporta tipi array
Supporta ARRAY per memorizzare liste in una colonna
Non supporta tipi array
Cosa significa in pratica
Gli obiettivi progettuali di ciascun sistema e i carichi di lavoro per cui sono ottimizzati influenzano direttamente il loro funzionamento.
Queste differenze significano che, sebbene molte competenze SQL comuni siano trasferibili, dettagli come la dimensione massima del testo, le parole chiave per l’auto-incremento o il supporto per strutture complesse possono variare.
Se usi un solo sistema, è facile diventare esperto nelle particolarità del tuo DBMS. Tuttavia, cambiare lavoro o reparto può richiedere il passaggio a un DBMS diverso con regole differenti.
Per questo, quando impari SQL, è utile riconoscere i concetti condivisi dietro i tipi di dati piuttosto che fare affidamento solo sulle particolarità di un singolo sistema.
Scegliere il tipo di dato giusto
Selezionare un tipo di dato a volte è molto semplice, altre richiede un po’ di riflessione. Una buona scelta rende i dati più facili da interrogare, mantiene l’archiviazione snella e aiuta a evitare bug a valle. La macro-categoria sarà probabilmente determinata dal tipo di dato che hai.
Dati numerici
Per esempio, supponi di memorizzare dati di misurazione. Ovviamente vorrai un tipo numerico, non un calendario o una stringa. Ma quanto sono precise le misure da memorizzare? Vanno bene gli interi o servono i decimali? Ti serve un numero fisso di cifre significative?
Poi dovresti considerare archiviazione ed efficienza. Scegliere il tipo intero più piccolo che possa contenere in sicurezza i tuoi dati aiuta a mantenere le tabelle efficienti. Tipi più piccoli usano meno spazio e possono migliorare le prestazioni, soprattutto in tabelle grandi. Di solito conviene scegliere un tipo abbastanza grande per l’intervallo previsto senza andare molto oltre ciò che servirà realisticamente.
Quando un intero non basta, puoi scegliere tra DECIMAL e FLOAT. I tipi floating point approssimano i valori anziché memorizzarli esattamente, il che può causare errori di arrotondamento in ambiti finanziari, scientifici o altri sensibili all’accuratezza.
DECIMAL e NUMERIC memorizzano valori esatti, rendendoli preferibili per prezzi o rapporti. Tuttavia, i DECIMAL tendono ad avere requisiti di spazio maggiori rispetto ai FLOAT, a seconda di quante cifre decimali salvi.
Dati carattere e stringa
Per i dati testuali, pensa a quanto grande vuoi che sia ciascun input.
Di solito conviene dimensionare i campi VARCHAR in modo realistico, invece di impostare la lunghezza massima. Limiti eccessivamente ampi raramente migliorano la flessibilità, ma possono fuorviare gli sviluppatori futuri sulla dimensione attesa dei dati.
Pensa agli input attesi, che si tratti di nomi, email o titoli di prodotto, e dimensiona di conseguenza la colonna.
Dati data e ora
Per i dati di calendario, è utile essere precisi su cosa stai memorizzando.
Se ti serve solo una data o solo un orario, di solito è meglio usare DATE o TIME invece di DATETIME. Queste scelte rendono chiare le intenzioni e riducono le possibilità di fraintendimenti più avanti. Danno anche al database un po’ più di margine per ottimizzare query solo-data o solo-ora.
Dati booleani
Quando possibile, usa tipi adeguati al dominio come BOOLEAN invece di soluzioni alternative come interi o stringhe. I tipi nativi includono validazione integrata, semantica più chiara e supporto da funzioni del database che si aspettano tipi specifici di dati.
Di seguito trovi un riepilogo degli obiettivi comuni di archiviazione e dei tipi di dati SQL consigliati per raggiungerli.
Memorizza valori precisi senza problemi di arrotondamento floating point
Memorizzare testo breve o medio
VARCHAR(n)
Archiviazione efficiente con dimensione prevedibile e lunghezza flessibile
Memorizzare testo lungo e non strutturato
TEXT o CLOB
Progettati per blocchi di testo come descrizioni o documenti
Memorizzare solo data o solo ora
DATE o TIME
Evita complessità inutili e riflette il vero significato dei dati
Memorizzare valori flessibili in stile documento
JSON o JSONB
Utile per strutture annidate o in evoluzione che non si adattano a colonne fisse
Per i lettori che desiderano un ripasso su raggruppamento e filtraggio dei dati, il corsoIntermediate SQL accompagna attraverso queste competenze chiave.
Errori comuni e buone pratiche
Anche uno schema di database semplice può incontrare problemi se i tipi di dati non sono scelti con cura.
Troncamento
Per esempio, se hai una colonna per i nomi che consente solo 5 caratteri, potresti finire con “Micha” invece di “Michael”. Questo è un problema comune noto come troncamento.
Tipicamente si presenta in campi come nomi, indirizzi o commenti, dove la variabilità reale può superare un limite troppo ottimistico. Un modo per evitarlo è dimensionare i campi di testo basandosi su esempi reali o, in dubbio, stare leggermente larghi.
Errori di arrotondamento
Un altro problema comune è l’arrotondamento inatteso quando si usano valori floating point per denaro o altri dati sensibili alla precisione. Poiché i FLOAT memorizzano valori approssimati, piccole discrepanze possono accumularsi e influenzare report, riepiloghi o calcoli.
Puoi evitarlo scegliendo DECIMAL per tutto ciò che riguarda valute o valori decimali esatti. Questo assicurerà che il database mantenga numeri stabili.
Incongruenze di tipo
Le incongruenze di tipo possono anche portare a query lente, specialmente in join o confronti.
Quando una colonna è memorizzata come stringa e un’altra come intero (o quando ogni tabella usa un tipo leggermente diverso) e provi a unirle, il database potrebbe dover convertire i valori al volo. Questo può causare errori e aggiungere sovraccarico inutile.
Mantenere allineate le colonne correlate nel tipo evita queste conversioni nascoste e aiuta le query a girare più fluide.
Formattazione delle date
Le date di calendario hanno tutta una serie di problemi propri.
Le incoerenze nel formato delle date sono una fonte primaria di confusione quando i sistemi mescolano convenzioni locali o quando gli sviluppatori memorizzano le date come stringhe invece di usare i tipi adeguati. Queste incoerenze possono far funzionare male le query o restituire in silenzio risultati errati.
La soluzione semplice è usare i tipi di data reali e attenersi a un formato coerente e non ambiguo quando si lavora con date in forma testuale. Consiglio vivamente il corso Time Series Analysis in SQL Server per evitare i problemi di calendario più comuni nei tuoi database.
Buone pratiche
Ecco alcune buone pratiche per far funzionare al meglio i tuoi database:
Popola le tabelle con dati di esempio nelle prime fasi di progettazione per far emergere eventuali debolezze nelle scelte di dimensionamento o tipizzazione.
Documenta lo scopo e gli intervalli attesi di ciascuna colonna, così che modifiche future non introducano incongruenze.
Evita di usare tipi generici quando tipi più specifici migliorerebbero la chiarezza.
Conclusione
I tipi di dati definiscono come il tuo database “comprende” i valori che memorizzi. Influenzano tutto, dall’archiviazione alle prestazioni fino alla chiarezza. Imparare come funzionano rende i tuoi database più affidabili e prevedibili.
Un tipo di dato in SQL definisce il tipo di dati che una colonna può memorizzare e come quei dati si comportano quando vengono interrogati o elaborati. Influenza archiviazione, validazione, ordinamento, confronto e operazioni matematiche.
Domande frequenti sui tipi di dati SQL
Che cos’è un tipo di dato in SQL?⌄
Un tipo di dato in SQL è un insieme di regole che dice a SQL che tipo di informazione aspettarsi all’interno della colonna del tuo database. In sostanza, è il modo in cui il sistema “comprende” i tuoi dati.
Come imposto un tipo di dato specifico per una colonna in SQL?⌄
Quando definisci una colonna in SQL, imposti il tipo di dato subito dopo aver dato un nome alla colonna. Apparirà così: name DATATYPE. Puoi anche usare il comando ALTER COLUMN per aggiornare il tipo di dato in una colonna già definita.
Perché devo scegliere il tipo di dato giusto?⌄
Scegliere il tipo di dato migliore per i tuoi dati renderà chiaro che tipo di dato hai, garantirà un uso e un’archiviazione adeguati e preverrà bug a valle nel tuo codice.
Qual è la differenza tra DECIMAL e FLOAT?⌄
Un DECIMAL è un tipo di dato numerico preciso che memorizza il numero con un numero fisso di cifre decimali. Un FLOAT, invece, è un tipo di dato che memorizza un’approssimazione del numero.
Tutti i sistemi di gestione dei database usano gli stessi tipi di dati?⌄
Sì e no. Ogni sistema di gestione di database ha tipi di dati simili per dati numerici, di carattere e di calendario. Ma differiscono nei nomi specifici, in come sono usati dietro le quinte e nei tipi speciali che supportano.
Sono un PhD con 13 anni di esperienza nel lavoro con i dati in un contesto di ricerca biologica. Creo software in diversi linguaggi di programmazione, tra cui Python, MATLAB e R. Sono appassionato di condividere con il mondo il mio amore per l’apprendimento.
Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Impara i fondamenti dell'SQL necessari per il business, impara a scrivere query SQL e inizia ad analizzare i tuoi dati utilizzando questo potente linguaggio.
Quando inizi a lavorare con SQL, è facile pensare ai tipi di dati come a semplici etichette. Una singola colonna memorizza numeri, testo, date o tipi di dati speciali. Ma un tipo di dato è più di un'etichetta: è un insieme di regole che definisce cosa sia un valore agli occhi del database.
In pratica, i tipi di dati plasmano il modo in cui SQL “comprende” le informazioni nel tuo database. Sono un insieme di istruzioni che forniscono a SQL il contesto necessario per leggere, confrontare ed elaborare i tuoi dati in modo accurato.
In questo tutorial vedremo le principali categorie di tipi di dati SQL e come si comportano nei diversi sistemi di gestione dei database. Ti invito a seguire gli esempi lungo il percorso.
Se non hai molta esperienza con le tabelle di database, il nostro corso SQL Fundamentals offre basi chiare e adatte ai principianti per capire come sono strutturati dataset come questo.
Cosa sono i tipi di dati SQL?
Un tipo di dato descrive il formato dei tuoi dati: i valori che una colonna può contenere, come vengono archiviati internamente e quali operazioni hanno senso eseguirci sopra.
Questo significa che la scelta del tipo di dato incide su molto più del solo design della tabella. Può influenzare esigenze di archiviazione, prestazioni delle query, comportamento dell’ordinamento, operazioni matematiche e perfino come sistemi diversi interpretano lo stesso valore.
Ecco una tabella semplice che usa diversi tipi contemporaneamente:
Ogni colonna in questa tabella definisce il tipo di dati che può contenere.
La colonna
idmemorizzerà numeri interi, assegnando a ciascun dipendente un identificatore univoco.La colonna
namepuò contenere fino a 50 caratteri di testo, così da archiviare nomi brevi.La colonna
start_dateè per le date di calendario.La colonna
activememorizzerà valori vero o falso, rendendo semplice tracciare quali dipendenti sono attualmente attivi.Infine, la colonna
salarymemorizzerà importi monetari con una precisione di 10 cifre, mantenendo due cifre decimali per i centesimi.Insieme, queste colonne formano una tabella strutturata che applica regole sui tipi di valori consentiti in ciascun campo. Questo rende i dati più prevedibili e facili da usare.
Aggiungiamo alcuni dati di esempio e vediamo come potrebbe apparire la tabella risultante, usando PostgreSQL.
id
name
start_date
active
salary
1
Alice Johnson
2025-01-15
TRUE
55000.00
2
Bob Smith
2024-06-01
FALSE
62000.50
Sistemi di database diversi seguono gli stessi principi ma variano in nomi e funzionalità. Per esempio, SQL Server usa
BITinvece diBOOLEANe MySQL trattaBOOLEANcome un intero piccolo.Categorie di tipi di dati SQL
Ci sono quattro categorie principali di tipi di dati: numerici, carattere, data e speciali. Vediamole nel dettaglio.
Tipi di dati numerici
I tipi numerici memorizzano numeri interi o decimali. Il tipo numerico specifico determina l'intervallo, la precisione e la dimensione di archiviazione dei numeri memorizzati. I tipi più comuni in questa categoria sono:
interi, come
INT,SMALLINTeBIGINT, per numeri interi,decimali, come
DECIMAL(p, s)eNUMERIC(p, s), per valori decimali esatti,e floating point, come
FLOATeDOUBLE, per valori approssimati che possono introdurre piccole differenze di arrotondamentoCreiamo una tabella di esempio per mostrare diversi tipi di dati numerici:
Ecco come si presenterebbe la tabella di output:
product_id
price
measurement
1
19.99
3.1415
2
250.56
2.71828
Come puoi vedere, la prima colonna è vincolata a un numero intero, la seconda a un decimale con due cifre dopo il punto, e la terza è un decimale con un numero indefinito di cifre.
A prima vista,
DECIMALeFLOATpossono sembrare uguali. Ma c’è una differenza importante:DECIMALmemorizza un numero preciso con un numero specificato di cifre decimali, mentreFLOATmantiene un valore approssimato che può variare leggermente a seconda del sistema.È importante usare i decimali quando la precisione è necessaria e affidarsi ai float solo se sono accettabili piccoli errori di arrotondamento.
Categoria
Tipo/i di dato
Scopo / Cosa memorizza
Valore/i di esempio
Numerico
INT,SMALLINT,BIGINTNumeri interi di varie dimensioni
1, 42, 1000
Numerico
DECIMAL(p,s),NUMERIC(p,s)Valori decimali esatti con precisione fissa
19.99, 250.56
Numerico
FLOAT,DOUBLEValori decimali approssimati. Possono introdurre piccole differenze di arrotondamento
3.1415, 2.71828
Tipi di dati carattere e stringa
I tipi carattere memorizzano testo. Ce ne sono diversi che differiscono per prestazioni ed efficienza di archiviazione.
CHAR(n)è per set di caratteri a lunghezza fissa. Utile per dati sempre della stessa dimensione, come codici di stato o sigle aeroportuali.VARCHAR(n)è per set di caratteri a lunghezza variabile. Utile per nomi, indirizzi email e altro testo inserito dagli utenti.TEXTe tipi simili sono usati per blocchi di testo non strutturato, come post di blog o descrizioni di prodotto.Alcuni sistemi, come SQL Server, supportano anche stringhe Unicode, come
NCHAReNVARCHAR, utili quando i tuoi dati includono testi in più sistemi di scrittura, come latino, cinese o cirillico.Categoria
Tipo/i di dato
Scopo / Cosa memorizza
Valore/i di esempio
Carattere / Stringa
CHAR(n)Testo a lunghezza fissa
'US', 'CA'
Carattere / Stringa
VARCHAR(n)Testo a lunghezza variabile
'Alice Johnson', 'Bob Smith'
Carattere / Stringa
TEXTGrandi blocchi di testo non strutturato
'Contatto preferito via email.', 'Richiede copia della fattura per ogni ordine.'
Carattere / Stringa
NCHAR(n),NVARCHAR(n)Testo Unicode a lunghezza fissa o variabile
'Å', 'É', 'München', 'São Paulo'
Vediamo come appare con una tabella di esempio che dimostra diversi tipi di stringa:
Ecco come finirebbe per apparire questa tabella. Puoi vedere le differenze di lunghezza codificate in ciascun tipo di stringa.
id
country_code
name
notes
1
US
Alice Johnson
Preferred contact by email.
2
CA
Bob Smith
Requires invoice copy for each order.
Qui,
CHAR(2)impone una lunghezza costante, mentreVARCHAReTEXTconsentono maggiore flessibilità.Tipi di dati data e ora
I tipi di dati per data e ora consentono di memorizzare e interrogare in modo accurato le informazioni temporali. I principianti possono pensare di usare tipi numerici o stringhe per codificare questo tipo di informazioni. Tuttavia, ciò può causare problemi a valle con l’analisi dei dati. Usare un tipo di dato specifico per il calendario rende tutto più fluido.
I tre tipi più usati sono:
DATE, che codifica anno, mese e giorno,TIME, che memorizza ora, minuto e secondo,e
DATETIMEoTIMESTAMP, che memorizzano data e ora combinati.I database moderni possono anche supportare secondi frazionari o tipi di dati con fuso orario, come
TIMESTAMPTZin PostgreSQL, che memorizza timestamp in UTC e li converte automaticamente nel fuso orario della tua sessione al recupero.Categoria
Tipo/i di dato
Scopo / Cosa memorizza
Valore/i di esempio
Data / Ora
DATEDate di calendario (anno, mese, giorno)
'2025-11-26'
Data / Ora
TIMEOrario del giorno (ora, minuto, secondo)
'09:30:00', '18:45:30'
Data / Ora
DATETIME,TIMESTAMPData e ora combinati
'2025-11-20 14:15:00', '2025-11-21 09:00:00'
Data / Ora
TIMESTAMPTZData e ora con fuso orario (PostgreSQL)
'2025-11-21 09:00:00+00'
Creiamo una tabella semplice per demostrare questi tipi temporali:
Ecco come la tabellaapparirebbe:
event_id
event_date
start_time
created_at
1
2025-11-26
09:30:00
2025-11-20 14:15:00
2
2025-12-01
18:45:30
2025-11-21 09:00:00
Puoi vedere come la scelta del tipo di data o timestamp giusto influisca sul tipo di dato che puoi memorizzare.
Booleani e altri tipi di dati speciali
Non tutti i tipi di dati rientrano perfettamente nelle categorie precedenti. Per questi, SQL include una serie di tipi speciali per casi d’uso specifici. Alcuni tra i più comuni che potresti incontrare includono:
Valori booleani (
BOOLEAN,BOOLoBIT, a seconda del sistema) per registrare vero o falso,Dati binari (
BLOB) per immagini, file o oggetti serializzati,Testo di grandi dimensioni (
CLOB) per documenti completi,JSON(in MySQL e PostgreSQL) per dati senza schema o annidatiARRAY(solo in PostgreSQL) per listeUUIDper identificatori univoci che non si basano su sequenze numeriche, come un token di sessione o un codice di tracciamento globale.I tipi speciali ti permettono di memorizzare dati più ricchi o flessibili quando le tabelle tradizionali da sole non catturano la struttura.
Categoria
Tipo/i di dato
Scopo / Cosa memorizza
Valore/i di esempio
Speciale / Booleano / Altro
BOOLEAN,BOOL,BITValori vero o falso
TRUE, FALSE
Speciale / Booleano / Altro
BLOBOggetti binari di grandi dimensioni (immagini, file)
[binary image data]
Speciale / Booleano / Altro
CLOBDocumenti di testo di grandi dimensioni
'Testo integrale del contratto...'
Speciale / Booleano / Altro
JSONDati strutturati o annidati
'{"name": "Alice"}'
Speciale / Booleano / Altro
ARRAYListe di valori (solo PostgreSQL)
[1,2,3]
Speciale / Booleano / Altro
UUIDIdentificatori unici globali
'550e8400-e29b-41d4-a716-446655440000'
Tipi di dati SQL nei diversi sistemi
I sistemi di gestione dei database differiscono nei dettagli di come usano questi tipi di dati. Sebbene le macro-categorie restino le stesse, nomi e comportamenti esatti variano tra i sistemi.
I diversi sistemi progettano i loro tipi di dati con priorità proprie, motivo per cui i comportamenti differiscono. Alcune differenze sono minime, come la parola chiave usata. Altre cambiano il comportamento pratico dei dati, come i limiti sulla lunghezza del testo, come vengono archiviati i booleani o se il sistema supporta formati specializzati.
MySQL enfatizza velocità e semplicità, quindi usa scelte pratiche e leggere come
TINYINT(tecnicamente memorizzato come numeri) per i valori booleani. Favorisce prestazioni e ampia compatibilità rispetto a una semantica di tipo rigorosa.PostgreSQL punta alla conformità agli standard e all’estensibilità. Ciò si riflette nell’uso di un vero tipo
BOOLEANe in un set più ricco di opzioni, comeARRAYeJSONBper memorizzare dati strutturati o annidati direttamente in una colonna.SQL Server è pensato per prestazioni prevedibili in ambienti enterprise e un’integrazione profonda con l’ecosistema Microsoft. Per questo offre tipi fortemente definiti come
BITper i booleani eVARCHAR(MAX)per il testo di grandi dimensioni.La tabella seguente mostra affiancati come tre grandi sistemi SQL implementano concetti comuni.
Concetto
MySQL
PostgreSQL
SQL Server
Numerico (numeri interi)
Usa
INTper numeri interi genericiUsa
INTEGERper numeri interiUsa
INTper numeri interiNumeri decimali / a precisione fissa
Usa
DECIMAL(p, s)per valori numerici precisiUsa
NUMERIC(p, s)per memorizzazione a precisione esattaUsa
DECIMAL(p, s)per valori numerici precisiStringhe di testo di lunghezza standard
Usa
VARCHAR(n)per testo a lunghezza variabileUsa
VARCHAR(n)per testo a lunghezza variabileUsa
VARCHAR(n)per testo a lunghezza variabileArchiviazione di testo lungo
Usa
TEXTper campi di testo lunghiUsa
TEXTper campi di testo lunghiUsa
VARCHAR(MAX)per campi di testo lunghiValori booleani
Memorizza i booleani come
TINYINT(1)(0 o 1)Usa valori
BOOLEANnativi (true/false)Usa
BIT(0 o 1) per dati tipo booleanoChiavi primarie auto-incrementali
Usa la parola chiave
AUTO_INCREMENTUsa
SERIALoIDENTITYper interi auto-generatiUsa
IDENTITYper interi auto-generatiStringhe di caratteri molto grandi
Usa
LONGTEXTper testo estremamente grandeConsente
VARCHARmolto grandi senza limite praticoUsa
VARCHAR(MAX)per testo grande o senza limitiArchiviazione JSON
Supporta
JSONper dati JSON strutturatiSupporta sia
JSON(testo) cheJSONB(ottimizzato binario)Supporta
JSON(memorizzato come testo)Archiviazione di array
Non supporta tipi array
Supporta
ARRAYper memorizzare liste in una colonnaNon supporta tipi array
Cosa significa in pratica
Gli obiettivi progettuali di ciascun sistema e i carichi di lavoro per cui sono ottimizzati influenzano direttamente il loro funzionamento.
Queste differenze significano che, sebbene molte competenze SQL comuni siano trasferibili, dettagli come la dimensione massima del testo, le parole chiave per l’auto-incremento o il supporto per strutture complesse possono variare.
Se usi un solo sistema, è facile diventare esperto nelle particolarità del tuo DBMS. Tuttavia, cambiare lavoro o reparto può richiedere il passaggio a un DBMS diverso con regole differenti.
Per questo, quando impari SQL, è utile riconoscere i concetti condivisi dietro i tipi di dati piuttosto che fare affidamento solo sulle particolarità di un singolo sistema.
Scegliere il tipo di dato giusto
Selezionare un tipo di dato a volte è molto semplice, altre richiede un po’ di riflessione. Una buona scelta rende i dati più facili da interrogare, mantiene l’archiviazione snella e aiuta a evitare bug a valle. La macro-categoria sarà probabilmente determinata dal tipo di dato che hai.
Dati numerici
Per esempio, supponi di memorizzare dati di misurazione. Ovviamente vorrai un tipo numerico, non un calendario o una stringa. Ma quanto sono precise le misure da memorizzare? Vanno bene gli interi o servono i decimali? Ti serve un numero fisso di cifre significative?
Poi dovresti considerare archiviazione ed efficienza. Scegliere il tipo intero più piccolo che possa contenere in sicurezza i tuoi dati aiuta a mantenere le tabelle efficienti. Tipi più piccoli usano meno spazio e possono migliorare le prestazioni, soprattutto in tabelle grandi. Di solito conviene scegliere un tipo abbastanza grande per l’intervallo previsto senza andare molto oltre ciò che servirà realisticamente.
Quando un intero non basta, puoi scegliere tra
DECIMALeFLOAT. I tipi floating point approssimano i valori anziché memorizzarli esattamente, il che può causare errori di arrotondamento in ambiti finanziari, scientifici o altri sensibili all’accuratezza.DECIMALeNUMERICmemorizzano valori esatti, rendendoli preferibili per prezzi o rapporti. Tuttavia, iDECIMALtendono ad avere requisiti di spazio maggiori rispetto aiFLOAT, a seconda di quante cifre decimali salvi.Dati carattere e stringa
Per i dati testuali, pensa a quanto grande vuoi che sia ciascun input.
Di solito conviene dimensionare i campi
VARCHARin modo realistico, invece di impostare la lunghezza massima. Limiti eccessivamente ampi raramente migliorano la flessibilità, ma possono fuorviare gli sviluppatori futuri sulla dimensione attesa dei dati.Pensa agli input attesi, che si tratti di nomi, email o titoli di prodotto, e dimensiona di conseguenza la colonna.
Dati data e ora
Per i dati di calendario, è utile essere precisi su cosa stai memorizzando.
Se ti serve solo una data o solo un orario, di solito è meglio usare
DATEoTIMEinvece diDATETIME. Queste scelte rendono chiare le intenzioni e riducono le possibilità di fraintendimenti più avanti. Danno anche al database un po’ più di margine per ottimizzare query solo-data o solo-ora.Dati booleani
Quando possibile, usa tipi adeguati al dominio come
BOOLEANinvece di soluzioni alternative come interi o stringhe. I tipi nativi includono validazione integrata, semantica più chiara e supporto da funzioni del database che si aspettano tipi specifici di dati.Di seguito trovi un riepilogo degli obiettivi comuni di archiviazione e dei tipi di dati SQL consigliati per raggiungerli.
Obiettivo
Tipo di dato consigliato
Perché
Memorizzare valori numerici esatti (denaro, misurazioni)
DECIMALoNUMERICMemorizza valori precisi senza problemi di arrotondamento floating point
Memorizzare testo breve o medio
VARCHAR(n)Archiviazione efficiente con dimensione prevedibile e lunghezza flessibile
Memorizzare testo lungo e non strutturato
TEXToCLOBProgettati per blocchi di testo come descrizioni o documenti
Memorizzare solo data o solo ora
DATEoTIMEEvita complessità inutili e riflette il vero significato dei dati
Memorizzare valori flessibili in stile documento
JSONoJSONBUtile per strutture annidate o in evoluzione che non si adattano a colonne fisse
Per i lettori che desiderano un ripasso su raggruppamento e filtraggio dei dati, il corso Intermediate SQL accompagna attraverso queste competenze chiave.
Errori comuni e buone pratiche
Anche uno schema di database semplice può incontrare problemi se i tipi di dati non sono scelti con cura.
Troncamento
Per esempio, se hai una colonna per i nomi che consente solo 5 caratteri, potresti finire con “Micha” invece di “Michael”. Questo è un problema comune noto come troncamento.
Tipicamente si presenta in campi come nomi, indirizzi o commenti, dove la variabilità reale può superare un limite troppo ottimistico. Un modo per evitarlo è dimensionare i campi di testo basandosi su esempi reali o, in dubbio, stare leggermente larghi.
Errori di arrotondamento
Un altro problema comune è l’arrotondamento inatteso quando si usano valori floating point per denaro o altri dati sensibili alla precisione. Poiché i
FLOATmemorizzano valori approssimati, piccole discrepanze possono accumularsi e influenzare report, riepiloghi o calcoli.Puoi evitarlo scegliendo
DECIMALper tutto ciò che riguarda valute o valori decimali esatti. Questo assicurerà che il database mantenga numeri stabili.Incongruenze di tipo
Le incongruenze di tipo possono anche portare a query lente, specialmente in join o confronti.
Quando una colonna è memorizzata come stringa e un’altra come intero (o quando ogni tabella usa un tipo leggermente diverso) e provi a unirle, il database potrebbe dover convertire i valori al volo. Questo può causare errori e aggiungere sovraccarico inutile.
Mantenere allineate le colonne correlate nel tipo evita queste conversioni nascoste e aiuta le query a girare più fluide.
Formattazione delle date
Le date di calendario hanno tutta una serie di problemi propri.
Le incoerenze nel formato delle date sono una fonte primaria di confusione quando i sistemi mescolano convenzioni locali o quando gli sviluppatori memorizzano le date come stringhe invece di usare i tipi adeguati. Queste incoerenze possono far funzionare male le query o restituire in silenzio risultati errati.
La soluzione semplice è usare i tipi di data reali e attenersi a un formato coerente e non ambiguo quando si lavora con date in forma testuale. Consiglio vivamente il corso Time Series Analysis in SQL Server per evitare i problemi di calendario più comuni nei tuoi database.
Buone pratiche
Ecco alcune buone pratiche per far funzionare al meglio i tuoi database:
Popola le tabelle con dati di esempio nelle prime fasi di progettazione per far emergere eventuali debolezze nelle scelte di dimensionamento o tipizzazione.
Documenta lo scopo e gli intervalli attesi di ciascuna colonna, così che modifiche future non introducano incongruenze.
Evita di usare tipi generici quando tipi più specifici migliorerebbero la chiarezza.
Conclusione
I tipi di dati definiscono come il tuo database “comprende” i valori che memorizzi. Influenzano tutto, dall’archiviazione alle prestazioni fino alla chiarezza. Imparare come funzionano rende i tuoi database più affidabili e prevedibili.
Per approfondire l’argomento, dai un'occhiata al Tutorial panoramica sui database SQL e a Tipi di dati SQLite: uno sguardo ravvicinato alle classi di archiviazione. Consiglio anche il corso PostgreSQL Summary Stats and Window Functions, che mostra come calcolare totali progressivi e statistiche ordinate.
Un tipo di dato in SQL definisce il tipo di dati che una colonna può memorizzare e come quei dati si comportano quando vengono interrogati o elaborati. Influenza archiviazione, validazione, ordinamento, confronto e operazioni matematiche.