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 | ||
| Storage | Range (Un)signed | |
| TINYINT | 1 byte | -128 to 127 0 to 255 |
| SMALLINT | 2 bytes | -32,768 to 32,767 0 to 65,535 |
| MEDIUMINT | 3 bytes | -8,388,608 to 8,388,607 0 to 16,777,215 |
| INT | 4 bytes | -2,147,683,648 to 2,147,683,647 0 to 4,294,976,295 |
| BIGINT | 8 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 | ||
| FLOAT | 4 byte | |
| DOUBLE | 8 byte | |
| FIXED POINT | ||
| Storage | ||
| DECIMAL or NUMBER | vedi 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.
| Storage | Maximun Lenght | |
| CHAR(M) | M characters | 255 characters |
| VARCHAR(L) | L characters + 1 o 2 bytes necessari per calcolare la dimensione | 65,535 characters |
| TINYTEXT | L characters + 1 byte | 255 characters |
| TEXT | L characters + 2 byte | 65,535 characters |
| MEDIUMTEXT | L characters + 3 byte | 16,777,215 characters |
| LONGTEXT | L characters + 4 byte | 4,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.
| Storage | Range | |
| DATA | 3 bytes | 1000-01-01 to 9999-12-31 |
| TIME | 3 bytes | -838:59:59 to 838:59:59 |
| DATETIME | 8 bytes | 1000-10-10 00:00:00 to 9999-12-31 23:59:59 |
| TIMESTAMP | 4 bytes | 1970-01-01 00:00:00 to mid years 2037 |
| YEAR | 1 | 1901 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.







Linkedin
Flickr
Anobii
Youtube
Lastfm