paolo@bimodesign.com | +34 608 61 64 10

DB Relational

        

MySQL - Tipi dati e loro caratteristiche (storage, range, ...)

In questo articolo, faro' una breve panoramica sui tipi di dati di MySql e sul loro storage fisico. In particolare per quel che riguarda i dati di tipo NUMERIC, STRING e TEMPORAL, sottolineando qualche caratteristica che li differenzia dagli altri db.
Cominciamo...

NUMERIC
In questa famiglia di dati numeric rientrano gli INTEGER, i FLOATING POINT e i FIXED POINT.
Diamo un'occhiata alle caratteristiche di ognuno.

INTEGER  
 StorageRange (Un)signed
TINYINT1 byte-128 to 127
0 to 255
SMALLINT2 bytes-32,768 to 32,767
0 to 65,535
MEDIUMINT3 bytes-8,388,608 to 8,388,607
0 to 16,777,215
INT4 bytes-2,147,683,648 to 2,147,683,647
0 to 4,294,976,295
BIGINT8 bytes.... to ....
0 to ....

Nota: Lo storage di un campo INT non cambia se gli assegniamo una dimensione!! Ovvero se definiamo

ID INT(4);
o
ID INT;

entrambi i campi occuperanno 4 bytes. Stesso discorso, se definiamo INT(4) o INT(8). Entrambi occuperanno 4 bytes.
La differenza risiede nella scelta di come visualizzare del dato, che tra l'altro, nel caso il valore sia superiore alla dimensione indicata, non viene comunque troncato.
Infine, se non si specifica l'attributo UNSIGNED, il range consentito sara' quello positivo.

FLOATING POINT  
 Storage
FLOAT4 byte
DOUBLE8 byte
FIXED POINT  
 Storage
DECIMAL or NUMBERvedi nota 3

Alcune considerazioni
1. La differenza tra FLOAT e DOUBLE risiede nello storage richiesto.
2. La differenza tra FLOATING POINT e FIXED POINT e' che i primi sono numeri arrontodabili, mentre i secondi no. Quest'ultimi ad esempio, si usano nel caso di calcoli che non devono essere arrontondati, come per esempio nei calcoli finanziari, per la valuta (currency)
3. Lo storage dei DECIMAL dipende dalla precisione (il numero di digits) e dalla scala (il numero di decimali)
4. DECIMAL e NUMBER sono sinonimi per MySql, ma non per l'SQL Standard.

STRING DATA
In questa famiglia di dati string rientrano i tre sottogruppi CHAR, BINARY e FIXED.
In questo articolo trattero' solo i primi, mentre per gli ultimi dedicherò in seguito un piccolo approfondimento.
Il sottogruppo CHAR, come del resto BINARY, si divide a sua volta in CHAR,VARCHAR,TEXT e quest'ultimi in ulteriore 4 sottogruppi.
Per rendere la lettura piu' semplice e veloce, la tabella prevede gia' quest'ultima sottodivisione.

 StorageMaximun Lenght
CHAR(M)M characters255 characters
VARCHAR(L)L characters + 1 o 2 bytes necessari per calcolare la dimensione65,535 characters
   
TINYTEXTL characters + 1 byte255 characters
TEXTL characters + 2 byte65,535 characters
MEDIUMTEXTL characters + 3 byte16,777,215 characters
LONGTEXTL characters + 4 byte4,294,967,295 characters

I tipi di dati sopra elencati si differenziano per la quantita' di dati che andranno a contenere, ovvero:
1. Lo storage per il CHAR sara' sempre lo stesso, a prescindere se il contenuto del campo sia completo o meno. Ad esempio, se un campo e' stato definito CHAR(30) questo occupera' sempre 30 caratteri, anche se all'interno viene inserito un valore stringa più corto. Quindi gli spazi vuoti non vengono eliminati.
2. Lo storage per il VARCHAR e' invece l'esatta lunghezza della stringa inserita, piu' 2 byte per archiviare il valore della lunghezza. Quindi gli spazi vuoti vengono eliminati
3. Lo storage per i tipi TEXT dipende dai sottotipi i quali necessitano da 1 a 4 bytes per archiviare la lunghezza. Come per i CHAR gli spazi vuoti non vengono eliminati.

TEMPORAL DATA
In questa famiglia rientrano i dati di tipo temporale, ovvero date e conteggio dei tempi.

 StorageRange
DATA3 bytes1000-01-01 to 9999-12-31
TIME3 bytes-838:59:59 to 838:59:59
DATETIME8 bytes1000-10-10 00:00:00 to 9999-12-31 23:59:59
TIMESTAMP4 bytes1970-01-01 00:00:00 to mid years 2037
YEAR11901 to 2155 (per year(4))
1970 to 2069 (per year(2))

Alcune considerazioni:
1. Il formato delle ore di TIME e' fuori standard 24h, perche' si puo' usare anche nel caso si calcoli cronometrici o di altri tempi.
2. TIMESTAMP rappresenta i secondi trascorsi dal 1970-01-01. Inoltre si puo' usare come data corrente di default, nelle insert o update. (CURRENT_TIMESTAMP). Per altri approfondimenti sul questa tipologia di dato, rimando alla relativa sezione del manuale ufficiale.