Nella precedente lezione abbiamo spiegato cos’è un database e abbiamo detto che, per immagazzinare i dati, esso ricorre a tabelle a loro volta organizzate in colonne e righe. All’interno di ogni colonna i dati immagazzinati devono essere tra loro omogenei, cioè essere dello stesso tipo.
Dichiarare i tipi di dato
Quando si definisce la struttura di una tabella bisogna dichiarare, per ciascuna colonna, il tipo di dato che essa dovrà ospitare: testo, numeri, date, ecc.
La dichiarazione del tipo di dato deve essere fatta al momento della creazione della tabella ma può essere cambiata anche successivamente. La modifica del tipo di dato, tuttavia, è una operazione non sempre semplicissima quando la tabella ospita già dei dati al suo interno: per cambiare il tipo di dato, infatti, è necessario che i dati già presenti nella colonna siano compatibili con esso!
E’ bene, quindi, prestare la massima attenzione in fase di creazione delle tabelle nella definizione dei giusti tipi di dato.
I tipi di dato di SQL
Ogni DBMS ha i "suoi" tipi di dato, di seguito elencheremo le tipologie più diffuse che risultano essere presenti in tutti i principali database in commercio tralasciando, invece, i tipi di dati peculiari di specifici DBMS per i quali si rimanda a documentazioni dedicate.
Tipi di dati numerici
- INT, BIGINT e SMALLINT: INT rappresenta i valori interi (senza cifre decimali), BIGINT e SMALLINT rappresentano, rispettivamente, numeri interi molto grandi o non troppo grandi (BIGINT e SMALLINT vengono usati in casi specifici)
- NUMERIC e DECIMAL: sono utilizzati per rappresentare i numeri decimali
- REAL, DOUBLE e FLOAT: sono utilizzati per i numeri approssimativi
Facciamo qualche esempio: se una colonna viene dichiarata come INT potrà ospitare al suo interno solo valori numerici interi. Se viene dichiarata NUMERIC (o DECIMAL) sarà possibile definirne precisione e scala:
NUMERIC(precisione, scala)
Queste rappresentano, rispettivamente, il numero di cifre totali che ospiterà il campo e il numero di cifre dopo la virgola, più precisamente:
- precisione è il numero totale di cifre (>= 0)
- scala (> 0 e < precisione)
Tipi di dati stringa (testo)
- CHAR: è utilizzato per ospitare stringhe di lunghezza fissa; il valore minimo è 1 il massimo cambia a seconda del DBMS utilizzato (in MySQL è 255)
- VARCHAR: è utilizzato per ospitare stringhe di lunghezza variabile (viene specificata la lunghezza massima)
Facciamo un esempio: se una colonna viene dichiarata CHAR(5) essa potrà ospitare stringhe di testo lunghe sempre 5 caratteri. Se viene inserito un valore testuale più corto il sistema aggiungerà automaticamente degli spazi per raggiungere la lunghezza definita. Se si prova ad archiviare una stringa più lunga di 5 caratteri, viceversa, si riceverà un errore.
Nel caso di VARCHAR, invece, l’unica discriminante è la lunghezza massima.
Tipi di dato temporali
SQL definisce dei tipi temporali per permettere la gestione di date e ore. E’ importante precisare che il formato usato è quello anglosassone, cioè:
ANNO-MESE-GIORNO
e
ORA:MINUTI:SECONDI
- DATE: rappresenta le date espresse come anno (4 cifre), mese (2 cifre comprese tra 1 e 12), giorno (2 cifre comprese tra 1 e 31 con ulteriori restrizioni a seconda del mese, ad es. febbraio può essere massimo 28 o 29 a seconda che l’anno sia bisestile o meno); i valori sono separati dal trattino (-)
- TIME: rappresenta gli orari espressi nel formato ora (2 cifre), minuti (2 cifre) e secondi (2 cifre) separati dal simobolo dei due punti (:)
- DATETIME: rappresenta data e orario, quest’ultimo con la precisione al millisecondo.
Tipi boleani
SQL prevede un tipo BOOLEAN appositamente previsto per la gestione di valori booleani (VERO/FALSO). Accetta come valore: TRUE, FALSE, 0 e 1.
Non tutti i DBMS supportano campi di questo tipo. In MySQL, ad esempio, per i valori booleani si è soliti utilizzare un campo numerico – TINYINT(1) – che verrà valorizzato come 0 (falso) o 1 (vero).
Il valore NULL
Valore NULL è una speciale costante presente in tutti i DBMS: esso rappresenta l’assenza di informazione. Ogni campo non valorizzato, a prescindere dal tipo di dato, può essere NULL.