MySQL/Types de données
Types de données principaux.
Voici les valeurs acceptées pour chaque type de variable en octets, au-delà desquelles un stockage provoque un débordement :
 TINYINT (1o : -127+128)
 SMALLINT (2o : +-65 000)
 MEDIUMINT (3o : +-16 000 000)
 INT (4o : +- 2 000 000 000) 
 BIGINT (8o : +- 9 trillions)
 Intervalle précis : -(2^(8*N-1)) -> (2^8*N)-1
 /!\ INT(2) = "2 chiffres affichés" -- ET NON PAS "nombre à 2 chiffres"
FLOAT(M,D) DOUBLE(M,D) FLOAT(D=0->53) 
 /!\ 8,3 -> 12345,678 -- PAS 12345678,123!
TIME (HH:MM) 
YEAR (AAAA) 
DATE (AAAA-MM-JJ) 
DATETIME (AAAA-MM-JJ HH:MM; années 1000->9999)
TIMESTAMP (comme date, mais 1970->2038, compatible Unix)
VARCHAR(ligne) 
TEXT (multi-lignes; taille max=65535) 
BLOB (binaire; taille max=65535)
Variantes : 
TINY (max=255) 
MEDIUM (max=~16000) 
LONG (max=4Go)
 Ex : TINYTEXT, LONGBLOB, MEDIUMTEXT
ENUM ('valeur1', 'valeur2', ...) -- (default NULL, ou " si NOT NULL)
Pour gagner en performances et en espace disque, il est très important de restreindre au maximum les types. Par exemple pour une liste de pays, utiliser SMALLINT au lieu de INT s'avère payant.
VARCHAR.
codice_1 est l'abréviation de codice_2 ("caractère variant" en anglais). 'n' représente la taille maximum de colonne (jusqu'à caractères). Par exemple, une colonne de type codice_3 peut contenir 10 caractères maximum. La taille du stockage correspondant en fait à la taille du texte contenu (L), plus un ou deux octets (un si la taille est inférieure à 255).
Par exemple pour la chaîne "abcd", L = 4 et le stockage = 5.
codice_4 est similaire à codice_5 sauf qu'il occupe une taille fixe, il ne tient pas compte de son contenu. Un champ CHAR prend donc plus de place de stockage, est 20 % plus performant pour les recherches s'il est index.
TEXT et BLOB.
Les types codice_6 et codice_7 (binary large object) ont une taille maximum de caractères. L'espace requis est la taille réelle des données stockées, plus un ou deux octets (un si < 255). Comme elles ne sont pas stockées dans le fichier de données, toutes les opérations (codice_8) les concernant sont plus lentes, mais cela a l'avantage de rendre celles qui ne les touchent pas plus rapides.
Toutefois le codice_7 possède plusieurs déclinaisons :
INTEGER.
Spécifier une valeur "n" entre parenthèses n'a aucun effet. De toute façon, la taille maximum des données stockées est de 429 fois 107.
Pour les nombres uniquement positifs (comme les index qui représentent les numéros de ligne), utiliser codice_13, sinon codice_14.
Le nombre entre parenthèses après les types entiers indique sur combien de chiffres l'entier stocké est prévu pour être affiché. Toutefois s'il est plus long que cela, cela n'empêchera pas son stockage.
DECIMAL.
Syntaxe : codice_15.
Ex : codice_16 signifie des nombres jusqu'à 99,99 (quatre chiffres dont deux réservés aux décimales).
DATE.
Il existe trois types pour stocker des dates : codice_17, codice_18, et codice_19.
MySQL récupère et affiche les dates au format "AAAA-MM-JJ" (plus pratique pour les classer de gauche à droite).
codice_17 est utilisé quand les valeurs doivent contenir l'heure en plus du jour.
La différence entre codice_17 et codice_19 est que la taille des formatscodice_19 est limitée aux années 1970-2037.
Le type codice_24 peut stocker les heures du jour (HH:MM:SS) sans date. Il peut aussi représenter une période de temps (ex : -02:00:00 pour deux heures avant). Limité entre '-838:59:59' et '838:59:59'.
codice_25 peut stocker des années.
Pour manipuler des dates, il faut préciser un jour et pas seulement une heure, car pourrait interpréter "HH:MM:SS" comme une valeur "YY:MM:DD".
Les exemples suivant montrent la plage de date précise pour les temps Unix, démarrant à l'époque Unix jusqu'à 2038 (formula_1).
 mysql> SET time_zone = '+00:00'; -- GMT
 Query OK, 0 rows affected (0.00 sec)
 mysql> SELECT FROM_UNIXTIME(-1);
 | FROM_UNIXTIME(-1) |
 | NULL |
 1 row in set (0.00 sec)
 mysql> SELECT FROM_UNIXTIME(0); -- "Epoch"
 | FROM_UNIXTIME(0) |
 | 1970-01-01 00:00:00 |
 1 row in set (0.00 sec)
 mysql> SELECT FROM_UNIXTIME(2145916799);
 | FROM_UNIXTIME(2145916799) |
 | 2037-12-31 23:59:59 |
 1 row in set (0.00 sec)
 mysql> SELECT FROM_UNIXTIME(2145916800);
 | FROM_UNIXTIME(2145916800) |
 | NULL |
 1 row in set (0.00 sec)
Les fonctions de manipulation de date seront exposées dans un chapitre ultérieur.
SET et ENUM.
codice_26 est un type dont les valeurs sont prédéfinies dans une liste lors de la création de la table. 
codice_27 est similaire mais restreint à un seul membre, alors que codice_26 autorise le stockage de n'importe lesquelles de ses valeurs ensemble.
Exemple :
SET("madame", "monsieur") -- autorise un champ vide, "madame", "monsieur", "madame, monsieur", ou "monsieur, madame"
ENUM("madame", "monsieur") -- autorise un champ vide, "madame" ou "monsieur"
Vérification.
Pour connaitre le type d'un champ :
 DESCRIBE MaTable MonChamp
Pour vérifier que le contenu d'un champ est un toujours un nombre entier :
 SELECT MonChamp FROM MaTable WHERE NOT MonChamp REGEXP '^-?[0-9]+$';