DOUBLE vs DECIMAL dans MySQL

L'exemple de la documentation MySQL http://dev.mysql.com/doc/refman/5.1/en/problems-with-float.html (je le rétrécis, la documentation de cette section est la même pour 5.5)

mysql> créer la table t1 (i int, d1 double, d2 double);

mysql> insérer dans les valeurs t1 (2, 0,00, 0,00),
                             (2, -13,20, 0,00),
                             (2, 59,60, 46,40),
                             (2, 30,40, 30,40);

mysql> sélectionner
         je,
         somme (d1) en tant que,
         somme (d2) comme b
       de
         t1
       par groupe
         je
       ayant un <> b; – a! = b

+ —— + ——————- + —— +
| je | a | b |
+ —— + ——————- + —— +
| 2 | 76.80000000000001 | 76,8 |
+ —— + ——————- + —— +
1 rangée en jeu (0,00 sec)

Fondamentalement, si vous additionnez un, vous obtenez 0-13,2 + 59,6 + 30,4 = 76,8. Si nous résumons b, nous obtenons 0 + 0 + 46,4 + 30,4 = 76,8. La somme de a et b est la même mais la documentation MySQL dit:

Une valeur à virgule flottante telle qu'écrite dans une instruction SQL peut ne pas être identique à la valeur représentée en interne.

Si nous répétons la même chose avec décimal:

mysql> créer la table t2 (i int, d1 décimal (60,30), d2 décimal (60,30));
Requête OK, 0 lignes affectées (0,09 sec)

mysql> insérer dans les valeurs t2 (2, 0,00, 0,00),
                             (2, -13,20, 0,00),
                             (2, 59,60, 46,40),
                             (2, 30,40, 30,40);
Requête OK, 4 lignes affectées (0,07 sec)
Enregistrements: 4 Doublons: 0 Avertissements: 0

mysql> sélectionner
         je,
         somme (d1) en tant que,
         somme (d2) comme b
       de
         t2
       par groupe
         je
       ayant un <> b;

Ensemble vide (0,00 sec)

Le résultat attendu est un ensemble vide.

Donc, tant que vous n'effectuez aucune opération arithémétique SQL, vous pouvez utiliser DOUBLE, mais je préférerais toujours DECIMAL.

Une autre chose à noter sur DECIMAL est l'arrondi si la partie fractionnaire est trop grande. Exemple:

à lire :  Coûts de démarrage d'une entreprise pour un restaurant

mysql> créer la table t3 (d décimal (5,2));
Requête OK, 0 lignes affectées (0,07 sec)

mysql> insérer dans les valeurs t3 (d) (34.432);
Requête OK, 1 ligne affectée, 1 avertissement (0,10 s)

mysql> afficher les avertissements;
+ ——- + —— + ———————————- —— +
| Niveau | Code | Message |
+ ——- + —— + ———————————- —— +
| Remarque | 1265 | Données tronquées pour la colonne «d» à la ligne 1 |
+ ——- + —— + ———————————- —— +
1 rangée en jeu (0,00 sec)

mysql> sélectionnez * dans t3;
+ ——- +
| d |
+ ——- +
| 34,43 |
+ ——- +
1 rangée en jeu (0,00 sec)

    

DOUBLE vs DECIMAL dans MySQL
4.9 (98%) 32 votes
 

Julien