Vous aurez l'affichage suivant :
Nombre stocké Nombre affiché
45
0045
4156
4156
785164
785164
Nombres décimaux
Cinq mots-clés permettent de stocker des nombres décimaux dans une colonne : DECIMAL, NUMERIC, FLOAT, REAL et
DOUBLE.
NUMERIC et DECIMAL
NUMERIC et DECIMAL sont équivalents et acceptent deux paramètres : la précision et l'échelle.
La précision définit le nombre de chiffres significatifs stockés, donc les 0 à gauche ne comptent pas. En effet 0024 est
équivalent à 24. Il n'y a donc que deux chiffres significatifs dans 0024.
L'échelle définit le nombre de chiffres après la virgule.
Dans un champ DECIMAL(5,3), on peut donc stocker des nombres de 5 chiffres significatifs maximum, dont 3 chiffres sont
après la virgule. Par exemple : 12.354, -54.258, 89.2 ou -56.
DECIMAL(4) équivaut à écrire DECIMAL(4, 0).
En SQL pur, on ne peut pas stocker dans un champ DECIMAL(5,3) un nombre supérieur à 99.999, puisque le nombre
ne peut avoir que deux chiffres avant la virgule (5 chiffres en tout, dont 3 après la virgule, 5-3 = 2 avant). Cependant,
MySQL permet en réalité de stocker des nombres allant jusqu'à 999.999. En effet, dans le cas de nombres positifs,
MySQL utilise l'octet qui sert à stocker le signe - pour stocker un chiffre supplémentaire.
Comme pour les nombres entiers, si l'on entre un nombre qui n'est pas dans l'intervalle supporté par la colonne, MySQL le
remplacera par le plus proche supporté. Donc si la colonne est définie comme un DECIMAL(5,3) et que le nombre est trop loin
dans les positifs (1012,43 par exemple), 999.999 sera stocké, et -99.999 si le nombre est trop loin dans les négatifs.
S'il y a trop de chiffres après la virgule, MySQL arrondira à l'échelle définie.
FLOAT, DOUBLE et REAL
Le mot-clé FLOAT peut s'utiliser sans paramètre, auquel cas quatre octets sont utilisés pour stocker les valeurs de la colonne. Il
est cependant possible de spécifier une précision et une échelle, de la même manière que pour DECIMAL et NUMERIC.
Quant à REAL et DOUBLE, ils ne supportent pas de paramètres. DOUBLE est normalement plus précis que REAL (stockage dans
8 octets contre stockage dans 4 octets), mais ce n'est pas le cas avec MySQL qui utilise 8 octets dans les deux cas. Je vous
conseille donc d'utiliser DOUBLE pour éviter les surprises en cas de changement de SGBDR.
Valeurs exactes vs. valeurs approchées
Les nombres stockés en tant que NUMERIC ou DECIMAL sont stockés sous forme de chaînes de caractères. Par conséquent,
c'est la valeur exacte qui est stockée. Par contre, les types FLOAT, DOUBLE et REAL sont stockés sous forme de nombres, et
c'est une valeur approchée qui est stockée.
Cela signifie que si vous stockez par exemple 56,6789 dans une colonne de type FLOAT, en réalité, MySQL stockera une valeur
qui se rapproche de 56,6789 (par exemple, 56,678900000000000001). Cela peut poser problème pour des comparaison notamment
(56,678900000000000001 n'étant pas égal à 56,6789). S'il est nécessaire de conserver la précision exacte de vos données (l'exemple
type est celui des données bancaires), il est donc conseillé d'utiliser un type numérique à valeur exacte (NUMERIC ou DECIMAL
donc).
La documentation anglaise de MySQL donne des exemples de problèmes rencontrés avec les valeurs approchées.
N'hésitez pas à y faire un tour si vous pensez pouvoir être concernés par ce problème, ou si vous êtes simplement
curieux.
Types alphanumériques
Partie 1 : MySQL et les bases du langage SQL
27/414
www.openclassrooms.com
Précédent

- 27/413

Suivant