6.2 Types de colonnes
6 Référence du langage MySQL
Manuel de Référence MySQL 4.1 : Version Française
->Types numériques . Les types date et heure . Les types chaînes . Choisir le bon type de colonne . Utilisation des types de données issues d'autres SGBDR . Capacités des colonnes
|
6.2.1 Types numériques 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 :
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.
Dans ce cas, toutefois, l'intervalle des valeurs pouvant être stockés dans la colonne
salaire
varie de
-99.99
à
99.99
.
(MySQL peut actuellement stocker des nombres allant jusqu'à
999.99
dans cette
colonne car il n'a pas besoin de l'espace qui sert à stocker le signe pour un nombre
positif)
En ANSI/ISO SQL92, la syntaxe
DECIMAL(p)
est équivalente à
DECIMAL(p,0)
.
De manière similaire, la syntaxe
DECIMAL
est équivalente à to
DECIMAL(p,0)
,
où l'implémentation est autorisée à choisir la valeur de
p
.
MySQL ne supporte pas actuellement ces formes variantes des types de données
DECIMAL
/
NUMERIC
. Cela ne pose pas généralement de grand problèmes, vu que
le principal bénéfice de ces types est de pouvoir contrôler explicitement la précision
et l'échelle.
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.
L'intervalle de validité maximale 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 tronquage 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
|
|