3. Tipi di dato comuni

In questo capitolo vedremo i tipi di dato più comuni che MySQL ci fornisce per creare della applicazioni basiche. Nei capitoli successivi disporrete di una reference completa, inutile ora che stiamo cercando di imparare le basi che ci consentiranno poi di padroneggiare il linguaggio.

Di seguito una lista dei tipi più comuni:

  • VARCHAR
  • CHAR
  • TEXT e derivati
  • INT e derivati
  • FLOAT, DOUBLE e DECIMAL
  • BOOL
  • ENUM
  • DATE
  • DATETIME

VARCHAR serve a memorizzare stringhe di lunghezza variabile di cui non conosciamo a priori la lunghezza, come ad esempio il cognome di un utente.
Questo tipo di dato può ospitare da 1 a 255 byte quindi una stringa da 1 ad un massimo di 255 caratteri.

CHAR ci consente di memorizzare stringhe (o un solo carattere) di lunghezza fissa. Utile per memorizzare il codice fiscale oppure una Partita IVA di cui conosciamo già l'esatta lunghezza.

TEXT ci servirà per salvare stringhe molto più lunghe della capienza di un semplice VARCHAR, come ad esempio il testo di una news.
Vediamo di seguito TEXT e le sue utili varianti:

  • TINYTEXT - 255 byte
  • TEXT - 65.535 byte (64KB)
  • MEDIUMTEXT - 16.777.215 byte (16MB)
  • LONGTEXT - 4.294.967.295 byte (4GB)

INT memorizza numeri interi. Vediamo velocemente le sue specifiche:

  • TINYINT da -128 a 127 (UNSIGNED da 0 a 255)
  • SMALLINT da -32768 a 32767 (UNSIGNED da 0 a 65535)
  • MEDIUMINT da -8388608 a 8388607 (UNSIGNED da 0 a 16777215)
  • INT da -2147483648 a 2147483647 (UNSIGNED da 0 a 4294967295)
  • BIGINT - da -9223372036854775808 a 9223372036854775807 (UNSIGNED da 0 a 18446744073709551615)

I tipi FLOAT, DOUBLE e DECIMAL vengono usati per memorizzare numeri in virgola mobile.
Innanzitutto quando dichiariamo un campo di questo tipo, MySQL ci consente di specificare due parametri, il primo per la dimensione del dato, il secondo per la precisione di quest ultimo.

Se quindi dichiarassimo un FLOAT(5,2) potremmo rappresentare un numero in virgola del genere: 999,99.
La differenza fra FLOAT e DOUBLE sta nel numero di byte massimo riservati alla precisione del numero. Quattro per il FLOAT e otto per il DOUBLE.

Il tipo DECIMAL invece viene utilizzato per specificare con esattezza lo spazio riservato alla memorizzazione e per assicurarsi che venga mantenuta l'esatta precisione del dato, utile per memorizzare dati monetari.

Un DECIMAL(5,2) ci consentirà di gestire dati da -999,99 a 999,99.

Il tipo BOOL ci consente di gestire dati di tipo booleano ossia un campo che possa assumere solo i valori true e false.
Nella versione MySQL 5.1, questo tipo di dato non è supportato a livello nativo, e sarà introdotto in una versione successiva.
Attualmente il tipo BOOL non è altro che un alias del tipo TINYINT(1). Vi troverete quindi a leggere un semplice numero intero, considerando lo 0 come false e il numero 1 come true.

Il tipo ENUM, invece, ci consente di impostare a priori un set di valori predefinito che un dato può assumere. Qualunque valore proposto che non è incluso nel nostro insieme predefinito, genererà un errore.
ENUM ci tornerà quindi molto utile con campi che potranno assumere un'insieme di valori non molto grande che conosciamo già, come ad esempio il sesso di una persona.

Potremmo quindi modificare la tabella "utenti" del capitolo 3 aggiungendo il campo "sesso" di tipo ENUM, specificando i valori che potrà assumere attraverso la stessa query di modifica.

ALTER TABLE `utenti`
ADD `sesso` ENUM('M','F') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL

In questo modo MySQL sa che il campo sesso potrà assumere solo i valori M o F e agirà di conseguenza.
Vedremo più avanti come sfruttare questa particolarità a nostro vantaggio quando andremo a parlare di performance MySQL.

Vediamo infine gli ultimi due tipi di questo capitolo.
DATE e DATETIME utilizzati rispettivamente per memorizzata una data oppure data e ora.

Con DATE possiamo memorizzare tutte le date (giorno, mese e anno) che vanno dal primo gennaio 1000 (1000-01-01) fino al 31 dicembre 9999 (9999-12-31). Con DATETIME possiamo memorizzare le stesse date di DATE ma potremo tenere traccia anche dell'orario.

La data verrà espressa in questo formato YYYY-MM-DD, mentre l'orario sarà il classico HH:MM:SS.