# Tipo di dato (basi di dati)

Nell'ambito dei database, il tipo di dato, che in informatica indica il valore semantico da attribuire ad una variabile (vedi tipo di dato), è un concetto essenziale nella creazione di una tabella. Più precisamente, esso consente di identificare la tipologia di valori (ad esempio una stringa di caratteri, un numero o una data) che ogni colonna potrà contenere.
Esiste un "valore speciale", che un dato di qualsiasi tipo può assumere: si tratta di NULL. Sul suo significato preciso esistono diverse discussioni a livello accademico. Secondo alcuni, NULL rappresenta l'assenza di un valore, mentre secondo altri rappresenta un valore sconosciuto.
Ogni Database management system presenta tipi di dati differenti. Eccone alcuni:
* Stringhe alfanumeriche di caratteri
* Numeri matematici
* Valori booleani
* Date
* Dati in codice binario
* Rowid
* Array e Multiset

## Stringhe alfanumeriche di caratteri

* CHAR(d): può contenere una stringa di caratteri a lunghezza fissa, pari a d (dalla versione 7 in poi del database Oracle). La dimensione massima dichiarabile è 2000 byte (ogni carattere occupa 1 byte di memoria, in formato ASCII esteso). Se non viene specificata, è impostata automaticamente a 1. Essendo una lunghezza fissa, nel caso che venga inserita una stringa di n caratteri (dove n è minore di d), il DBMS aggiunge in coda alla stessa d-n caratteri ‘ ‘ (spazio o blank) in modo da raggiungere la lunghezza massima dichiarata.
* VARCHAR2(d): può contenere una stringa di caratteri a lunghezza variabile, pari a d. La dimensione massima è 4000 byte.
* VARCHAR(d): fino alla versione 8 è analogo a VARCHAR2. Il suo utilizzo è, però, sconsigliato da Oracle perché le sue caratteristiche potrebbero variare nelle future versioni del database di questa società.
* LONG: può contenere una stringa di caratteri, di dimensione variabile, fino ad un massimo di 2 gigabyte. È un tipo di dato soggetto a pesanti limitazioni: per ogni tabella è possibile definire una sola colonna di tipo LONG, inoltre non è possibile applicare ai dati determinate funzioni valide per VARCHAR2 e CHAR.
* LONG VARCHAR: Identico a LONG.
* CLOB: può contenere una stringa di caratteri, di dimensione variabile, fino ad un massimo di 4 gigabyte.
* NCLOB: come CLOB ma può contenere anche caratteri formati da più byte ognuno.

## Valori numerici

* NUMBER(d,p): può contenere numeri matematici (interi o decimali, positivi e negativi) formati da d cifre (fino ad un massimo di 38). Può essere indicata la precisione p, cioè il massimo numero di cifre decimali utilizzabili, che è comunque un “di cui” della dimensione d. Sia dimensione che precisione sono parametri facoltativi: se non vengono esplicitate, la prima è impostata automaticamente a 38. Sono sempre riservati 1 byte per il segno e 1 byte per il separatore decimale.
* DECIMAL(d,p): identico a NUMBER
* FLOAT: identico a NUMBER.
* INTEGER: identico a NUMBER(38). Non è possibile dimensionarlo (cioè specificarne la lunghezza in byte). Può contenere soltanto numeri interi (senza cifre decimali).
* SMALLINT: Identico a NUMBER(38).

## Valori booleani

Un dato booleano può assumere solo due valori: vero (TRUE) o falso (FALSE). Generalmente un dato booleano occupa soltanto un bit.

## Date

* DATE: caratterizza un'informazione di tipo data; può contenere anche ore, minuti e secondi. Nel caso dei database Oracle una colonna di tipo DATE potrà contenere soltanto valori appartenenti all'intervallo arbitrario 1º gennaio 4712 a.C. – 31 dicembre 4712 d.C.

## Dati in codice binario

* BLOB: può contenere dati in formato binario fino ad un massimo di 4 gigabyte. Viene utilizzato per memorizzare su tabella immagini grafiche oppure programmi applicativi scritti in altri linguaggi.
* RAW(d): può contenere dati in formato binario la cui dimensione d massima è di 2000 byte.

## Rowid

È un tipo di dato particolare che caratterizza i valori restituiti dalla pseudo-colonna ROWID, esistente per ogni tabella, che rappresenta l'indirizzo fisico del record e lo caratterizza in modo univoco. Normalmente viene visualizzato in formato esadecimale.

## Tipi geometrici

Alcuni Dbms, come PostgreSQL e MySQL, forniscono anche alcuni tipi di dati geometrici, o spaziali. Lo standard OpenGIS definisce le seguenti classi:
* Geometry
* Point
* Curve
* LineString
* Surface
* Polygon
* GeometryCollection
* MultiPoint
* MultiCurve
* MultiLineString
* MultiSurface
* MultiPolygon

## Array e Multiset

Lo standard SQL99 aggiunge il tipo array; lo standard SQL2003 lo estende aggiungendovi nuovi operatori e aggiunge il tipo Multiset. Si tratta di tipi molto criticati dalla comunità degli sviluppatori, in quanto un database normalizzato non può contenere più di un'informazione per ogni colonna, mentre gli array e i multiset sono pensati appunto per immagazzinare diverse informazioni in una.

## Altri tipi

PostgreSQL fornisce i tipi inet e cidr per registrare gli indirizzi IP e macaddr per registrare gli indirizzi MAC. MySQL fornisce i tipi enum e set. Entrambi hanno una lista di valori possibili definita dall'utente di volta in volta, ma il loro comportamento è differente. Un dato di tipo enum può assumere uno di questi valori oppure nessuno (NULL); un dato di tipo set può assumere più valori contemporaneamente ed è assimilabile a una maschera di bit.