21mar/110
Les bases de MySQL

Lors de la création d'une base de données il est toujours bon d'avoir en mémoire les différents types de colonnes MySQL. (M décrit la taille maximale d'affichage du champ, D est mis pour décimal, UNSIGNED permet d'optimiser le stockage de chiffres positifs, ZEROFILL remplit les chiffres de zéros).
| Type | Nb Octets | Commentaires |
| TINYINT[(M)] [UNSIGNED] [ZEROFILL] | 1 | Très petit entier. Va de -128 à 127, de 0 à 255 si non signé |
| SMALLINT[(M)] [UNSIGNED] [ZEROFILL] | 2 | Petit entier. Va de -32 768 à 32 767, de 0 à 65 535 si non signé |
| MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] | 3 | Entier moyen. Va de -8 388 608 à 8 388 607, de 0 à 16 777 215 si non signé |
| INT[(M)] [UNSIGNED] [ZEROFILL] | 4 | Va de -2 147 483 648 à 2 147 483 647, de 0 à 4 294 967 295 si non signé |
| INTEGER[(M)] [UNSIGNED] [ZEROFILL] | 4 | Synonyme de INT |
| BIGINT[(M)] [UNSIGNED] [ZEROFILL] | 8 | Grand entier. Va de -9 223 372 036 854 775 808 à 9 223 372 036 854 775 807, de 0 à 18 446 744 073 709 551 615 si non signé |
| FLOAT(précision) [ZEROFILL] | 4 si précision <= 24 ou 8 si 25 <= precision <= 53 | Flottant |
| FLOAT[(M,D)] [ZEROFILL] | 4 | Flottant à precision simple. Va de -1.175494351E-38 à 3.402823466E+38 |
| DOUBLE[(M,D)] [ZEROFILL] | 8 | Flottant à double precision. Va de -2.2250738585072014E-308 à 1.7976931348623157E+308 |
| DOUBLE PRECISION[(M,D)] [ZEROFILL] | 8 | Synonyme de DOUBLE |
| REAL[(M,D)] [ZEROFILL] | 8 | Synonyme de DOUBLE |
| DECIMAL[(M[,D])] [ZEROFILL] | M+2 octets si D > 0, M+1 octets si D = 0 (D+2, si M < D) | Flottant stocké comme une chaîne de caractères |
| NUMERIC(M,D) [ZEROFILL] | M+2 octets si D > 0, M+1 octets si D = 0 (D+2, si M < D) | Synonyme de DECIMAL |
| DATE | 3 | Date 'YYYY-MM-DD' allant de '1000-01-01' à '9999-12-31' |
| DATETIME | 8 | Date et heure 'YYYY-MM-DD HH:MM:SS' allant de '1000-01-01 00:00:00' à '9999-12-31 23:59:59' |
| TIMESTAMP[(M)] | 4 | Date allant de '1970-01-01 00:00:00' à quelque part en 2037. L'affichage dépend de M : YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, ou YYMMDD pour, respectivement : 14, 12, 8, ou 6 |
| TIME | 3 | Heure 'HH:MM:SS', allant de '-838:59:59' à '838:59:59' |
| YEAR[(2|4)] | 1 | Année à 2 ou 4 chiffres allant de 1901 à 2155 pour 4 chiffres et de 1970-2069 pour 2 chiffres |
| [NATIONAL] CHAR(M) [BINARY] | M octets, 1 <= M <= 255 | Chaîne de charactères (jusq'à 255) remplie d'espaces à la fin. Ces espaces sont enlevés lors d'une requête. BINARY entraine une recherche sensible à la casse |
| BIT | 1 | Synonyme de CHAR(1) |
| BOOL | 1 | Synonyme de CHAR(1) |
| CHAR | 1 | Synonyme de CHAR(1) |
| [NATIONAL] VARCHAR(M) [BINARY] | L+1 octets, où L <= M et 1 <= M <= 255 | Chaîne de caractères (jusqu'à 255). BINARY entraine une recherche sensible à la casse |
| TINYBLOB | L+1 octets, où L < 2^8 | Chaîne de charactères (jusqu'à 255), sensible à la casse |
| TINYTEXT | L+1 octets, où L < 2^8 | Chaîne de charactères (jusqu'à 255), insensible à la casse |
| BLOB | L+2 octets, où L < 2^16 | Chaîne de charactères (jusqu'à 65 535), sensible à la casse |
| TEXT | L+2 octets, où L < 2^16 | Chaîne de charactères (jusqu'à 65 535), insensible à la casse |
| MEDIUMBLOB | L+3 octets, où L < 2^24 | Chaîne de charactères (jusqu'à 16 777 215), sensible à la casse |
| MEDIUMTEXT | L+3 octets, où L < 2^24 | Chaîne de charactères (jusqu'à 16 777 215), insensible à la casse |
| LONGBLOB | L+4 octets, où L < 2^32 | Chaîne de charactères (jusqu'à 4 294 967 295), sensible à la casse |
| LONGTEXT | L+4 octets, où L < 2^32 | Chaîne de charactères (jusqu'à 4 294 967 295), insensible à la casse |
| ENUM('value1','value2',...) | 1 ou 2 octets, selon le nombre d'énumérations (65 535 valeurs maximum) | Enumération de 65 535 chaînes différentes |
| SET('value1','value2',...) | 1, 2, 3, 4 ou 8 octets, selon de nombre de membres de l'ensemble | Ensemble qui peut contenir de 0 à plusieurs valeurs choisies dans une liste de valeurs |
- pour un auto-increment, utiliser MEDIUMINT UNSIGNED qui permet d'identifier 16 777 215 enregistrements en ne consommant que 3 octets.
- pour les devises, l'usage de DECIMAL est encouragé pour une bonne gestion de la précision.
- pour les dates, le type TIMESTAMP est déconseillé, lourd à gérer lors des mises à jours, il faut lui préférer DATETIME.
- un mot tout de même sur l'unique différence entre un champ de type BLOB et un champ de type TEXT : BLOB est sensible à la casse alors que TEXT est insensible à la casse.
- PHP ne faisant pas de différence entre 0 et NULL, autant déclarer tous les champs NOT NULL, on gagne ainsi 1 bit par champ et par enregistrement.