Vai al contenuto principale

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.
· 14 min leggi

Scopri con l'IA

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:

CREATE TABLE employees (
    id INT,
    name VARCHAR(50),
    start_date DATE,
    active BOOLEAN,
    salary DECIMAL(10, 2)
);

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.

INSERT INTO employees (id, name, start_date, active, salary)
VALUES
    (1, 'Alice Johnson', '2025-01-15', TRUE, 55000.00),
    (2, 'Bob Smith', '2024-06-01', FALSE, 62000.50);
    
SELECT *
FROM employees;

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 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.

Common SQL Data Types

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:

CREATE TABLE products (
    product_id INT,
    price DECIMAL(8, 2),
    measurement FLOAT
);

INSERT INTO products VALUES 
    (1, 19.99, 3.1415),
    (2, 250.56, 2.71828);

SELECT * FROM products;

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, 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:

CREATE TABLE customers (
    id INT,
    country_code CHAR(2),
    name VARCHAR(100),
    notes TEXT
);

INSERT INTO customers VALUES
    (1, 'US', 'Alice Johnson', 'Preferred contact by email.'),
    (2, 'CA', 'Bob Smith', 'Requires invoice copy for each order.');
    
SELECT * FROM customers;

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:

CREATE TABLE events (
    event_id INT,
    event_date DATE,
    start_time TIME,
    created_at DATETIME
);

INSERT INTO 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;

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.

Obiettivo

Tipo di dato consigliato

Perché

Memorizzare valori numerici esatti (denaro, misurazioni)

DECIMAL o NUMERIC

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 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 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.

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.

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.

Amberle McKee

Autore

Amberle McKee

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.

Argomenti

Correlato