Mauricio Cabral
a- a+

Tipi di dati

Per un’efficace progettazione di un database, è essenziale considerare la scelta del tipo di “contenitore” dei propri dati. Con una corretta definizione del tipo di colonna si può rendere un database veloce ed economico (in termini di byte). In questo capitolo approfondiremo questa tematica.

Voglio iniziare questo capitolo con un esempio.
Immaginate di essere il responsabile di un magazzino, facciamo di un Ferramenta. Voi dovete organizzare i prodotti in modo che occupino il minor spazio possibile, che siano organizzati per tipo e che sia il più facile possibile trovarli.
Ora il vostro capo vi ha incaricato di montare uno scaffale nel quale dovrete stoccare gli articoli (bulloni, vite, rondelle, chiavi e tutti gli altri oggetti del caso). Una volta montato lo scaffale, il “capo” vi indica i contenitori che potrete utilizzare, da una rapida occhiata notate che avete una vasta scelta.
Sarete d’accordo con me se dico che potete riempire tutto, con i contenitori più grandi che avete, sicuramente potrete stoccare qualsiasi materiale, dal semplice bullone alla “motosega 3000 turbo”, lo spazio disponibile sarà sempre sufficiente. Il fatto è che dovete ricordare della regola di prima!
Se volete un magazzino veramente efficiente dovete fare attenzione a queste regole; per oggetti piccoli - piccoli contenitori, per oggetti grandi – grandi contenitori, oggetti di forma particolare – contenitori adatti all’oggetto. Mi dirette “hai scoperto l’acqua calda”, si, la cosa sembra ovvia, ma in un database (per di più MySQL che a volte è costretto a lavorare su Hardware poco potenti), questa situazione può rendere una applicazione più o meno efficiente, e nei nostri “scaffali digitali” la scelta del tipo di contenitore di dati può essere fatta in modo ancora più preciso, non solo per le loro dimensioni ma anche per il loro utilizzo.

Per capire meglio tutto il discorso, andiamo a vedere quali strumenti ci offre MySQL.
(alla fine troverete un riepilogo più veloce di tutti i tipi)

Tipo Numerico

I tipi numerici sono destinati a contenere numeri, quindi, come potete ben pensare, se si tenta di inserire una stringa o comunque un carattere soltanto, si riceverà come risposta un errore.
Si può scegliere il tipo di colonna secondo la grandezza del dato e della memoria che questo occuperà. Le colonne di tipo numerico sono elaborate in maniera più rapida rispetto a quelle di tipo stringa.

TINYINT
Può contenere da -128 A 127, se alla colonna viene assegnata la proprietà UNSIGNED, questa potrà memorizzare soltanto numeri positivi da 0 a 255. La memoria occupata sarà di 1 byte.

SMALLINT
Può contenere da -32.768 A 32.767, se alla colonna viene assegnata la proprietà UNSIGNED, questa potrà memorizzare soltanto numeri positivi da 0 a 65.535. La memoria occupata sarà di 2 byte.

MEDIUMINT
Può contenere da -8.388.608 A 8.388.607, se alla colonna viene assegnata la proprietà UNSIGNED, questa potrà memorizzare soltanto numeri positivi da 0 a 16.777.215. La memoria occupata sarà di 3 byte.

INT
Può contenere da -2.147.483.648 A 2.147.483.647, se alla colonna viene assegnata la proprietà UNSIGNED, questa potrà memorizzare soltanto numeri positivi da 0 a 4.294.967.295. La memoria occupata sarà di 4 byte.

BIGINT
Può contenere da -9.223.372.036.854.775.808 A 9.223.372.036.854.775.807, se alla colonna viene assegnata la proprietà UNSIGNED, questa potrà memorizzare soltanto numeri positivi da 0 a 18.446.744.073.709.550.615. La memoria occupata sarà di 8 byte.


FLOAT(M, D)
Può contenere numeri con virgola mobile. Si possono definire certi parametri, come limitare il numero di cifre, prima e dopo la virgola: (M,) definisce il numero di cifre prima della virgola, (, D): definisce il numero di cifre dopo la virgola. I decimali contenuti dopo la virgola saranno arrotondati per difetto. La memoria occupata sarà di 4 byte.

DOUBLE(M, D)
Può contenere numeri con virgola mobile. Si possono definire certi parametri, come limitare il numero di cifre, prima e dopo la virgola: (M,) definisce il numero di cifre prima della virgola, (, D): definisce il numero di cifre dopo la virgola. I decimali contenuti dopo la virgola saranno arrotondati per difetto. La memoria occupata sarà di 8 byte.

DECIMAL(M, D)
Può contenere numeri con virgola mobile. Si possono definire certi parametri, come limitare il numero di cifre, prima e dopo la virgola: (M,) definisce il numero di cifre prima della virgola, (, D): definisce il numero di cifre dopo la virgola. I decimali contenuti dopo la virgola saranno arrotondati per difetto. La memoria occupata sarà di M + 2 byte.

 

Altre caratteristiche

Ci sono altre opzioni che si possono assegnare alle colonne di tipo numerico:


AUTO_INCREMENT

Definisce una colonna che aumenterà automaticamente aggiungendo 1 al valore più alto presente, più conosciuto come “contatore”.

NOT NULL
Indica che la colonna non può contenere un valore nullo.

NULL
Indica che la colonna può contenere un valore nullo.

DEFAULT (V)
Definisce il valore che verrà automaticamente inserito nel record.

ZEROFILL
Riempie il record di zeri fino all’esaurimento della memoria assegnata per la colonna.
Esempio: si inserisce in una colonna INT(10) ZEROFILL il valore 755, il database memorizzerà 0000000755.

PRIMARY KEY
Definisce una chiave primaria.

 


Tipi Stringa

Vediamo tutti i tipi di colonne che sono destinate a contenere stringhe alfanumeriche. Si possono definire le colonne in modo che siano il più veloce possibile elaborarle, scegliendo il tipo più adatto al tipo di dati che dovrà memorizzare.
Per i tipi stringa ci sono caratteristiche più marcanti.

CHAR
Può contenere caratteri alfanumerici, fino a 255 caratteri.
Si può definire il la lunghezza massima della colonna, “CHAR (40)”, in questo esempio la colonna potrà contenere al massimo 40 caratteri. Nel caso in cui venga inserito nella colonna, una stringa di lunghezza inferiore a quella impostata, il database provvederà a riempire con caratteri il resto del campo, quindi la colonna occuperà sempre la stessa quantità di memoria che avete definito al momento della creazione, in questo caso 40 byte.

VARCHAR
Può contenere caratteri alfanumerici, fino a 255 caratteri.
Si può definire il la lunghezza massima della colonna, “VARCHAR (40)”, come in precedenza questa colonna potrà contenere al massimo 40 caratteri (come indicato nella creazione). Ma c’è una differenza, se viene inserita una stringa con lunghezza inferiore a quella massima indicata, questa occuperà solo la sua lunghezza. Se inserisco “Ciao ragazzi”, la colonna verrà occupata solo da 12 byte + 1. Lunghezza + 1.

Allora CHAR o VARCHAR?

Si può pensare di usare solo il tipo VARCHAR, poiché occupa solo la lunghezza che viene inserita, non è un ragionamento sbagliato (per un senso), ma si era parlato di rendere una applicazione non solo “leggera” ma anche veloce. E qui c’è il trucco, il tipo VARCHAR occupa meno spazio, ma è elaborato più lentamente rispetto a CHAR (che occuperà sempre lo stesso spazio). Potete usare il tipo che più si adatta ai dati che dovete memorizzare, se i dati saranno sempre di lunghezza fissa e conosciuta, usate CHAR(numero_conosciuto), avrete un rendimento migliore del vostro database. Mentre se avete dei dati che possono variare di lunghezza e lo spazio a disposizione non è molto, VARCHAR fa al caso vostro.

TINYTEXT
Può contenere caratteri alfanumerici, fino a 255 caratteri.
La memoria occupata è di (lunghezza) + 1

TINYBLOB
Può contenere caratteri alfanumerici, fino a 255 caratteri.
La memoria occupata è di (lunghezza) + 1

TEXT
Può contenere caratteri alfanumerici, fino a 65.535 caratteri.
La memoria occupata è di (lunghezza) + 2

BLOB
Può contenere caratteri alfanumerici, fino a 65.535 caratteri.
La memoria occupata è di (lunghezza) + 2

MEDIUMTEXT
Può contenere caratteri alfanumerici, fino a 16.777.215 caratteri.
La memoria occupata è di (lunghezza) + 3

MEDIUMBLOB
Può contenere caratteri alfanumerici, fino a 16.777.215 caratteri.
La memoria occupata è di (lunghezza) + 3

LONGTEXT
Può contenere caratteri alfanumerici, fino a 4.294.967.295 caratteri.
La memoria occupata è di (lunghezza) + 4

LONGBLOB
Può contenere caratteri alfanumerici, fino a 4.294.967.295 caratteri.
La memoria occupata è di (lunghezza) + 4

Da notare che i tipi BLOB sono sensibili alle lettere maiuscole e alle minuscole, quindi, fate attenzione quando usate questi tipi, un dato inserito come “mysql” sarà diverso da “MySQL”.

 

Altre caratteristiche

Ci sono altre opzioni che si possono assegnare alle colonne di tipo stringa:


NOT NULL
Indica che la colonna non può contenere un valore nullo.

NULL
Indica che la colonna può contenere un valore nullo.

DEFAULT (V)
Definisce il valore che verrà automaticamente inserito nel record.

 


Tipi “data” e vari

Data

DATETIME
Memorizza la data e ora, compresi minuti e secondi. Utilizza il formatto YYYY-MM-DD HH:MM:SS, può varia da 1000-01-01 00:00:00 a 9999-12-31 23:59:59

DATE
Memorizza l’ora nel formatto YYYY-MM-DD, può variare da 1000-01-01 a 9999-12-31

TIME
Memorizza l’ora, può variare da -838:59:59 a 838:59:59

YEAR
Memorizza l’anno, può variare da 1901 a 2155

TIMESTAMP
Memorizza in modo automatico ad ogni record inserito, la data e ora correnti, si può impostare in diversi modi:

TIMESTAMP(14) YYYY-MM-DD HH:MM:SS
TIMESTAMP(12) YY-MM-DD HH:MM:SS
TIMESTAMP(10) YY-MM-DD HH:MM
TIMESTAMP(8) YYYY-MM-DD
TIMESTAMP(6) YY-MM-DD
TIMESTAMP(4) YY-MM
TIMESTAMP(2) YY


Vari


ENUM
Memorizza un elemento di un elenco, un esempio pratico è la creazione di un campo che simuli il True e False, si crea una colonna ENUM (‘Y’, ‘N’), può contenere anche un valore NULL. Il numero di elementi dell’elenco può arrivare fina a 65.535 voci, ENUM (‘qwert’, ‘zxz’, ‘khk’, ‘ssl’, ....), i valori sempre tra apici e separati da virgola
(‘’, ‘’, ‘’). L’elaborazione di queste colonne sono più rapide rispetto a quelle del tipo stringa.

SET
Molto simile a ENUM con la differenza che può più valori dell’elenco, può invece contenere solo 64 voci. SET (‘www’, ‘http’, ‘url’), la regola è sempre la stessa, i valori sempre tra apici e separati da virgola (‘’, ‘’, ‘’).


Altre caratteristiche

Ci sono altre opzioni che si possono assegnare alle colonne di tipo vario:


NOT NULL
Indica che la colonna non può contenere un valore nullo.

NULL
Indica che la colonna può contenere un valore nullo.

DEFAULT (V)
Definisce il valore che verrà automaticamente inserito nel record.

 

Tipo

Intervalo/Dimensioni

Memoria
TINYINT

-128 a 127 / 0 a 255

1 byte
SMALLINT

-32.768 A 32.767 / 0 a 65.535

2 byte
MEDIUMINT

-8.388.608 A 8.388.607 / 0 a 16.777.215

3 byte
INT

-2.147.483.648 A 2.147.483.647 / 0 a 4.294.967.295

4 byte
BIGINT

-9.223.372.036.854.775.808 A 9.223.372.036.854.775.807 / 0 a 18.446.744.073.709.550.615

8 byte
FLOAT(M, D)

Variabile

4 byte
DOUBLE(M, D)

Variabile

8 byte
DECIMAL(M, D)

Vaviabile

M + 2 byte
Tipo stringa
 
 
 
CHAR

255

M byte
VARCHAR

255

L + 1 byte
TINYTEXT

255

L + 1 byte
TINYBLOB

255

L + 1 byte
TEXT

65.535

L + 2 byte
BLOB

65.535

L + 2 byte
MEDIUMTEXT

16.777.215

L + 3 byte
MEDIUMBLOB

16.777.215

L + 3 byte
LONGTEXT

4.294.967.295

L + 4 byte
LONGBLOB

4.294.967.295

L + 4 byte
Tipo vario
 
 
 
DATETIME

1000-01-01 00:00:00 a 9999-12-31 23:59:59

 
DATE

1000-01-01 a 9999-12-31

 
TIME

-838:59:59 a 838:59:59

 
YEAR

1901 a 2155

 
TIMESTAMP

Variabile

 

 

 



Ti potrebbe interessare anche

commenta la notizia

Ci sono 1 commenti