8.Les types SQL
8.2.Les types SQL numériques (INTEGER, FLOAT, etc.)
8.2.1.Introduction
En ce qui concerne les types numériques, SQL distingue 2 grandes catégories: les entiers et les nombres décimaux (aussi appelés flottants).
Généralement, la déclaration de type utilisée par défaut pour un entier est INTEGER et FLOAT pour un nombre décimal.
La sélection d'un type entier peut (et doit) être complétée par une information précisant si celui-ci peut être négatif ou pas. S'il ne peut être négatif on placera le terme UNSIGNED après le nom du type. Ex INTEGER pour un entier signé, INTEGER UNSIGNED pour un entier positif.
Les types INTEGER etFLOAT se déclinent en plusieurs variantes selon la valeur maximale (ou minimale) que le champ peut atteindre et selon la précision que l'on souhaite pouvoir atteindre (correspondant en gros au nombres de chiffres après la virgule).
Ainsi, pour exemple, pour stocker dans une base MySQL une valeur comprise entre -128 et 127 (ou entre 0 et 255) on choisira un type TINYINT (ou TINYINT UNSIGNED) qui a l'avantage d'occuper le minimum de place en base (1 seul octet) à l'autre extrème si l'on souhaite pouvoir stocker un entier extrèmement grand on optera plutôt pour un type BIGINT (occupant 8 octets)
Les types ne portent pas toujours les mêmes noms d'un serveur de base de données à l'autre. Ainsi BIGINT est aussi appelé INT8 ou NUMBER(19,0) dans d'autres bases.
8.2.2.Les types entiers
Les valeurs que peuvent prendre ces champs sont intimement liés à leur occupation disque.
Entiers
|
Type
|
Min
|
Max
|
Taille en octet
|
TINYINT |
-128 |
127 |
1 |
TINYINT UNSIGNED |
0 |
255 |
1 |
SMALLINT INT2
|
-32768 |
32767 |
2 |
SMALLINT UNSIGNED
INT2 UNSIGNED
|
0 |
65535 |
2 |
MEDIUMINT |
-8388608 |
8388607 |
3 |
MEDIUMINT UNSIGNED |
0 |
16777215 |
3 |
INT
INT4
INTEGER |
-2147483648 |
2147483647 |
4 |
INT UNSIGNED
INT4 UNSIGNED
INTEGER UNSIGNED |
0 |
4294967295 |
4 |
BIGINT
INT8
|
-9223372036854775808 |
9223372036854775807 |
8 |
BIGINT UNSIGNED
INT8 UNSIGNED
|
0 |
18446744073709551615 |
8 |
Légende: SQL92
MySQL PostgreSQL
|
- Avec MySQL, lorsque l'on déclare un type pour un champ, on peut également y associer un mode "d'affichage". Ainsi à l'ensemble de ces types on peut associer le mot clé ZEROFILL pour compléter le nombre par des zeros jusqu'a avoir un affichage sur N chiffres où N est le nombre de chiffre du plus grand nombre positif du type sélectionné. Et on peut également fixer cette valeur de N en l'indiquant entre parenthèse.
|
Affichage du nombre 23 pour un champ de type |
INT |
23 |
INT ZEROFILL |
0000000023 |
INT(4) ZEROFILL |
0023 |
Ce qu'il faut retenir :
Avant de choisir un type entier, il faut se poser les questions suivantes :
- Ai-je besoin de stocker des nombres négatifs ?
- Quel est le plus grand nombre que je serai amené à stocker ?
|
Si vous souhaitez, par exemple, stocker le nombre de but marqués par votre équipe de foot préférée lors de leur dernier match alors inutile de choisir un type BIGINT optez plutot pour un TINYINT. Ainsi, chaque enregistrement occupera 8 fois moins de place. Même si ce n'est pas vraiment nécessaire ici, optez également pour un type UNSIGNED puisque ce nombre ne sera jamais négatif (on ne compte pas les buts contre son camp :-) ) on ne sait jamais s'il y a plus de 127 buts de marqués.
Le type BIGINT ne doit être utilisé que dans des cas bien spécifiques.
|
- Sous PostgreSQL c'est le type INT qui est utilisé par le type SERIAL (compteur).
|
8.2.3.Les types réels
Nombres décimaux
|
Type
|
Min
|
Max négatif
|
0
|
Min positif
|
Max
|
Taille en octet
|
FLOAT FLOAT4 |
-3.402823466E+38 |
-1.175494351E-38 |
0 |
1.175494351E-38 |
3.402823466E+38 |
4 |
DOUBLE DOUBLE PRECISION REAL FLOAT8 |
-1.7976931348623157E+308 |
-2.2250738585072014E-308 |
0 |
2.2250738585072014E-308 |
1.7976931348623157E+308 |
|
Ce qu'il faut retenir :
Avant de choisir un type décimal, il faut se poser les questions suivantes
- Quel est le plus grand nombre que je serai amené à stocker ?
- Quel est le plus petit nombre que je serai amené à stocker ?
- De quelle précision (nombre de chiffres après la virgule) aurais-je besoin ?
|