En MySQL 5.0.3, plusieurs modifications ont été apportées au
type de données DECIMAL
et ses synonymes :
Le nombre maximal de chiffres
Le format de stockage
La taille de stockage
L'extension non standard de MySQL sur l'intervale supérieure
des colonnes DECIMAL
Certaines de ces évolutions ont des incompatibilités potentielles avec les applications qui ont été écrites avec les vieilles versions de MySQL. Ces incompatibilités sont présentées dans cette section.
La syntaxe de déclaration des colonnes DECIMAL
reste
DECIMAL(
,
même si l'intervale de validité des arguments a un peu
changé :
M
,D
)
M
est le nombre maximal de
chiffres : la précision. Il prend une valeur entière entre
1 et 64. Cela introduit des incompatibilités possibles avec
les anciennes applications, car MySQL autorisait l'intervalle
de 1 à 254.
D
est le nombre de chiffres
décimaux : l'échelle. Il peut prendre des valeurs de 1 à
30, et ne doit pas dépasser M
.
La valeur maximale de 64 pour M
signifie que les calculs sur des valeurs
DECIMAL
ont une précision de 64 chiffres.
Cette limite de 64 chiffres s'applique aussi aux valeurs
numériques exactes littérales, ce qui fait que la taille
maximale des littéraux est différente. Avant MySQL 5.0.3, les
valeurs décimales pouvaient avoir jusqu'à 254 chiffres.
Cependant, les calculs étaient fait avec des virgules flottantes,
et restaient approximatifs. Ce changement dans la taille maximale
des nombres est aussi une source de conflit avec les anciennes
versions.
Les valeurs des colonnes DECIMAL
ne sont plus
représentées comme des chaînes, qui requiert un octet par
chiffre ou signe. A la plae, un format binaire est utilisé, et il
contient 9 chiffres dans 4 octets. Cela modifie la taille de
stockage des valeurs DECIMAL
. Chaque multiple
de 9 chiffres requiert 4 octets, et le reste requiert une fraction
de 9 chiffres. Par exemple, une colonne
DECIMAL(18,9)
a 9 chiffres de chaque coté de
la virgule, ce qui fait que la partie entière et la partie
décimale demandent 4 octets chacun. Une colonne
DECIMAL(20,10)
dipose de 10 chiffres de chaque
coté de la virgule. Cela fait 4 octets pour chaque gropue de 9
chiffres, et 1 octets pour le reste.
Le stockage requis pour le "reste" est présenté dans la table suivante :
Reste | Nombre |
Chiffres | d'octets |
0 | 0 |
1 | 1 |
2 | 1 |
3 | 2 |
4 | 2 |
5 | 3 |
6 | 3 |
7 | 4 |
8 | 4 |
9 | 4 |
Une conséquence du changement de chaîne en format binaire de
DECIMAL
est que les colonnes
DECIMAL
ne peuvent plus stocker le caractère
‘+
’ initial ou les
‘0
’ initiaux. Avant MySQL 5.0.3, si
vous insériez '+0003.1'
dans une colonne
DECIMAL(5,1)
, le nombre aurait été stocké
sous forme de +0003.1
. Depuis MySQL 5.0.3, il
est stocké sous forme de 3.1
. Les applications
qui exploitent le vieux comportement doivent être modifiées pour
prendre en copmte ce changement.
Le changemenet de format de stockage signifie que les colonnes
DECIMAL
ne supportent plus les extensions non
standard qui permettait aux valeurs trop grandes d'être
stockées. Pour les valeurs positives qui ne requierent pas de
signe, MySQL permettait l'ajout d'un chiffre de plus. Par exemple,
dans une colonne DECIMAL(3,0)
, l'intervale de
validité était de -
999 à
999
, mais MySQL permettait le stockage de
valeurs de 1000
à 9999
, en
utilisant l'octet de signe pour stocker les valeurs
supplémentaires. Cette extension de la valeur maximale des
colonnes DECIMAL
n'est plus autorisée. En
MySQL 5.0.3 et plus récent, une colonne
DECIMAL(
autorise le stockage d'au plus
M
,D
)M
−D
chiffres à gauche de la virgule décimale. Cela peut engendrer
des incompatibilités si une application exploitait cette
tolérance de MySQL.
Le standard SQL requiert que la précision des valeurs
NUMERIC(
soit exactement de M
,D
)M
. Pour
DECIMAL(
,
le standard requiert une précsion d'au moins
M
,D
)M
mais en autorise plus. Avec MySQL,
DECIMAL(
et
M
,D
)NUMERIC(
sont les mêmes, et les deux ont la même précision de
M
,D
)M
chiffres exactement.
Résumé des incompatibilités :
La liste suivante résume les incompatibilités qui résultent des
modifications des comportements des colonnes
DECIMAL
. Vous pouvez l'utiliser pour vérifier
votre anciennes applications et les migrer vers MySQL 5.0.3.
Pour
DECIMAL(
,
la valeur maximale de M
,D
)M
est 64, et
non plus 254.
Les calculs impliquant des valeurs décimales exactes ont 64 chiffres de précision. C'est inférieur au nombre maximal de chiffre précédemment autorisé avant MySQL 5.0.3 (254 chiffres), mais la précision est malgré tout amélioré. Les calculs étaient fait en double précision, ce qui représente 52 bits ou 15 chiffres.
L'extension non standard MySQL de la limite supérieur de
stockage des colonnes DECIMAL
n'est plus
supportée.
Les caractères initiaux ‘+
’ et
‘0
’ ne sont plus stockés.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.