MySQL supporte tous les types numériques de la norme ANSI/ISO
SQL92. Ceux-ci représentent les types numériques exacts
(NUMERIC
, DECIMAL
,
INTEGER
, et SMALLINT
), ainsi
que les types approchés (FLOAT
,
REAL
, et DOUBLE PRECISION
).
Le mot clef INT
est un synonyme de
INTEGER
, et le mot clef DEC
est un synonyme de DECIMAL
.
Les types NUMERIC
et DECIMAL
sont considérés comme identiques par MySQL, comme l'autorise le
standard SQL92. Ils sont utilisées par des valeurs dont il est
primordial de conserver la précision exacte, comme pour des
données financières. Lorsque vous déclarez des colonnes avec
l'un de ces types, vous pouvez indiquer la précision et
l'échelle comme ceci :
salaire DECIMAL(5,2)
Dans cet exemple, 5
(précision
) représente le nombre de
décimales signifiantes qui seront stockées pour les valeurs, et
2
(échelle
) représente le
nombre de chiffres qui seront stockés après le point des
décimales.
Les valeurs de type DECIMAL
et
NUMERIC
sont stockées sous forme de chaînes
de caractères, plutôt que comme des nombres à virgule
flottante, afin de préserver la précision décimale des valeurs.
Un caractère est donc nécessaire pour chaque chiffre, plus la
virgule (si scale
> 0), et le signe moins
‘-
’ (pour les nombres négatifs).
Si scale
vaut 0, les valeurs de type
DECIMAL
et NUMERIC
ne
comporteront pas de valeur décimale, ni de virgule.
Les standards SQL requièrent que la colonne
salary
soit capable de stocker toute valeur de
5 chiffres et 2 décimales. Dans ce cas, l'intervalle de valeur
qui peut être stockée dans la colonne salary
va de -999.99
et 999.99
.
MySQL dévie de cette spécification de deux manières :
A la limite supérieure de l'intervalle, la colonne peut
stocker les nombres jusqu'à 9999.99
. Pour
les nombres positifs, MySQL utilise l'octet réservé au signe
pour étendre la limite supérieure.
Les colonnes DECIMAL
de MySQL avant 3.23
sont stockés différemment et ne peuvent pas représenter
toutes les valeurs requises par le standard SQL. Ceci est dû
au fait que pour DECIMAL(M,D)
, la valeur de
M
inclut les octets pour le signe et le
point décimal. L'intervalle de la colonne
salary
avant MySQL 3.23 serait de
-9.99
à 99.99
.
Avec les standards SQL, la syntaxe DECIMAL(p)
est équivalente à DECIMAL(p,0)
. De manière
similaire, la syntaxe DECIMAL
est équivalente
à DECIMAL(p,0)
, où l'implémentation est
autorisée à choisir la valeur de p
. Depuis
MySQL 3.23.6, ces deux variantes de DECIMAL
et
NUMERIC
sont supportées. La valeur par défaut
de M
est 10. Avant la version 3.23.6,
M
et D
devaient être spécifié explicitement.
L'intervalle de validité maximal des valeurs de type
DECIMAL
et NUMERIC
est le
même que pour le type DOUBLE
, mais
l'intervalle réel peut être limité par le choix des paramètres
précision
et scale
.
Lorsqu'une valeur ayant trop de décimales est affectée à une
colonne, la valeur est arrondie à scale
décimales. Lorsqu'une valeur est hors des limites de validité de
la colonne DECIMAL
ou
NUMERIC
, MySQL enregistre la plus grande valeur
qu'il peut à la place.
En extension de la norme ANSI/ISO SQL92, MySQL supporte aussi les
types entiers TINYINT
,
MEDIUMINT
, et BIGINT
, comme
présenté ci-dessus. Un autre extension supportée par MySQL
permet de spécifier optionnellement la taille d'affichage, sous
la forme d'une valeur entière entre parenthèses, juste après le
mot clé spécifiant le type (par exemple, INT(4)). Cette
spécification de taille est utilisée pour remplir à gauche,
avec le caractère de remplissage par défaut, les nombres dont la
taille est inférieure à celle spécifiée mais uniquement à
l'affichage : cela ne réduit pas l'intervalle de validité des
valeurs qui peuvent être stockées dans la colonne.
Lorsqu'elle est utilisée avec l'attribut de colonne optionnel
ZEROFILL
, le caractère de remplissage par
défaut est remplacé par le caractère zéro. Par exemple, pour
une colonne dont le type est INT(5) ZEROFILL
,
la valeur 4
sera lue 00004
.
Notez que si vous stockez des nombres plus grands que la taille maximale d'affichage, vous pouvez rencontrer des problèmes lors de jointures de tables particulièrement compliquées, surtout si MySQL génére des tables temporaires : dans ce cas, MySQL pense que les données étaient limitées par l'affichage.
Tous les types entiers ont un attribut optionnel (non-standard)
UNSIGNED
(non-signé, en fran¸ais). Les
valeurs non-signées peuvent être utilisées pour n'autoriser que
des valeurs positives dans une colonne, ou bien pour exploiter un
intervalle de validité plus haut. Depuis la version 4.0.2 de
MySQL, les nombres à virgule flottante peuvent aussi être
UNSIGNED
Comme avec les types entiers, cet
attribut interdit les valeurs négatives dans la colonne, mais
n'élève pas l'intervalle de validité.
Le type FLOAT est utilisé pour représenter des données
numériques approchées. La norme ANSI/ISO SQL92 permet la
spécification optionnelle de la précision (mais pas de
l'intervalle de validité) en fournissant le nombre de décimales
voulues après la spécification de type, et entre parenthèses.
L'implémentation de MySQL supporte aussi le paramétrage de la
précision. Si le mot clé FLOAT
est utilisé
pour une colonne sans précision supplémentaire, MySQL utilise
quatre octets pour stocker les valeurs. Une syntaxe alternative
existe aussi, elle utilise deux paramètre optionnel après le mot
clé FLOAT
. Avec cette option, le premier
nombre représente toujours la taille de stockage nécessaire pour
la valeur, et le second nombre représente le nombre de chiffres
à stocker et afficher, après la virgule décimale (comme pour
les types DECIMAL
et
NUMERIC
). Lorsque MySQL stocke un nombre pour
une telle colonne, et que cette valeur a plus de décimale que
requis, la valeur est arrondie pour éliminer les chiffres
surnuméraires.
Les types REAL
et DOUBLE
PRECISION
n'acceptent pas de paramétrage de la
précision. En extension du standard ANSI/ISO SQL92, MySQL
reconnaît DOUBLE
comme un synonyme du type
DOUBLE PRECISION
. Contrairement à la norme qui
requiert que REAL
soit plus petit que
DOUBLE PRECISION
, MySQL implémente ces deux
types comme des nombres à virgule flottante de 8 octets, en
double précision (lorsque le mode ``ANSI'' n'est pas activé).
Pour une portabilité maximale, les applications réclamant le
stockage de nombres approché doivent utiliser les types
FLOAT
ou DOUBLE PRECISION
sans spécification de précision ou de nombre de décimales.
Lorsque MySQL doit stocker une valeur qui est hors de l'intervalle
de validité d'une colonne, il ramène la valeur à la plus proche
possible, et stocke cette valeur. Par exemple, l'intervalle de
validité d'une colonne d'entiers INT
va de
-2147483648
à 2147483647
.
Si vous essayez d'insérer -9999999999
dans une
colonne de ce type, la valeur sera ramenée à la plus proche
possible, c'est à dire -2147483648
. De même,
si vous essayez d'insérer 9999999999
,
2147483647
sera stocké à la place.
Si la colonne INT
possède l'attribut
UNSIGNED
, l'intervalle de validité est aussi
large, mais les valeurs extrêmes se décalent vers
0
et 4294967295
. Si vous
essayez de stocker -9999999999
et
9999999999
dans cette colonne, vous obtiendrez
respectivement 0
et
4294967296
.
Les dépassements de capacité entraînant des troncatures sont
affichés comme des alertes (``warnings
'') lors
de l'utilisation des commandes ALTER TABLE
,
LOAD DATA INFILE
, UPDATE
, et
les insertions INSERT
multiples.
Type | Octets | De | A |
TINYINT |
1 | -128 | 127 |
SMALLINT |
2 | -32768 | 32767 |
MEDIUMINT |
3 | -8388608 | 8388607 |
INT |
4 | -2147483648 | 2147483647 |
BIGINT |
8 | -9223372036854775808 | 9223372036854775807 |
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.