Avec les mathématiques de précisions, les valeurs exactes sont
utilisées aussi souvent que possible. Par exemple, les
comparaisons entre noms sont faîtes exactement, sans perte de
valeur. En mode SQL strict, lors d'une commande
INSERT
dans une colonne avec un type exact, tel
que DECIMAL
ou entier, un nombre est inséré
avec sa valeur exacte s'il est contenu dans l'intervale de
validité de la colonne. Lorsqu'il est lu, sa valeur est la même
que lors de l'insertion. Hors du mode strict, les arrondissements
sur INSERT
sont autorisés.
La gestion des expressions numériques dépends du type de valeurs qui sont manipulées :
Si une valeur approximative est impliquée, l'expression sera approximative, et sera évaluée avec l'arithmétique des nombres à virgule flottante.
Si aucune valeur approximative n'est impliquée, l'expression
ne contient que des valeurs exactes. Si aucune valeur ne
contient de partie décimale, l'expression sera évaluée avec
avec l'arithmétique exacte DECIMAL
et la
précision sera de 64 chiffres. "Exact" est soumis aux
limitations des représentations binaires.
1.0/3.0
peut être représenté par
.333...
avec un nombre infini de chiffre,
mais jamais "exactement" comme un tiers, et
(1.0/3.0)*3.0
ne vaudra jamais exactement
"1.0."
Sinon, l'expression ne contient que des entiers. L'expression
est exacte, et est évaluée avec l'arithmétique entière, et
la précision est celle d'un BIGINT
(64
bits).
Si une expression numérique contient des chaînes de caractères, elles sont converties en valeur décimale de précision double, et l'expression sera une approximation.
Les insertions dans les colonnes numériques sont affectées par
le mode SQL, qui est contrôlé par la variable système sql_mode.
Voyez see Section 1.5.2, « Sélectionner les modes SQL ». La présentation suivante
mentionne le mode strict, sélectionné par les valeurs
STRICT_ALL_TABLES
ou
STRICT_TRANS_TABLES
mode values et
ERROR_FOR_DIVISION_BY_ZERO
. Pour désactiver
ces contraintes, vous pouvez utiliser simplement le mode
TRADITIONAL
, qui inclut le mode strict et
ERROR_FOR_DIVISION_BY_ZERO
:
mysql> SET sql_mode='TRADITIONAL';
Si un nombre est inséré dans une colonne de type exact
(DECIMAL
ou entier), il sera inséré comme
valeur exacte s'il est dans l'intervale de validité de la
colonne.
Si la valeur a trop de chiffres décimaux, un arrondissement surviend et une alerte est générée. L'arrondissement se fait tel que décrit par le "Comportement d'arrondissement".
Si la valeur a trop de chiffres dans la partie entière, la valeur est alors trop grande, et elle est traitée comme ceci :
Si le mode strict n'est pas activé, la valeur est coupée à la première valeur valide, et une alerte est générée.
Si le mode strict est activé, une erreur de dépassement de capacité survient.
Les valeurs trop petites pour être stockées ne sont pas détectées, et aucune erreur ne survient dans ce cas : le comportement est indéfini.
Par défaut, la division par zéro produit le résultat de
NULL
et aucune alerte. Avec le mode SQL
ERROR_FOR_DIVISION_BY_ZERO
, MySQL gère les
divisions par zéro différemment :
Si le mode strict n'est pas activé, une alerte survient.
Si le mode strict est activé, les insertions et modifications qui manipulent des divisions par zéro sont interdites et une erreur survient.
En d'autres mots, les insertions et modifications qui impliquent
des divisions par zéro peuvent être traitées comme des erreurs,
mais cela requiert le mode SQL
ERROR_FOR_DIVISION_BY_ZERO
en plus du mode
strict.
Supposez que nous ayons la commande suivante :
INSERT INTO t SET i = 1/0;
Voici ce qui arrive dans différentes combinaisons du mode strict
et de ERROR_FOR_DIVISION_BY_ZERO
:
sql_mode Value |
Result |
'' |
Aucune alerte, aucune erreur, i prend la valeur de
NULL
|
strict | Aucune alerte, aucune erreur, i vaut NULL
|
ERROR_FOR_DIVISION_BY_ZERO |
Alerte, pas d'erreur, i vaut NULL
|
strict,ERROR_FOR_DIVISION_BY_ZERO
|
Erreur, pas d'insertion. |
Pour les inserionts de lignes dans une colonne numérique, la conversion de chaîne en valeur numérique est géré comme ceci :
Une chaîne qui ne commence pas par un nombre, ne peut pas être utilisée comme nombre et produit une erreur en mode strict, ou une alerte sinon. Cela vaut aussi pour les chaînes vides.
Une chaîne qui commence avec un nombre peut être convertie, mais la partie non numérique sera tronquée. Cela produit une erreur en mode strict et une alerte sinon.
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.