MySql FLOTTEUR type de données et les problèmes avec plus de 7 chiffres à l'échelle
Nous utilisons MySql 5.0 sur Ubuntu 9.04. La version complète est: 5.0.75-0ubuntu10
J'ai créé une base de données de test. et une table de test. Je vois la sortie suivante à partir d'une instruction insert:
mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into test value(858147.11);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM test;
+-----------+
| floaty |
+-----------+
| 858147.12 |
+-----------+
1 row in set (0.00 sec)
Il semble y avoir un problème avec la balance de précision mis en place dans mySql...ou ai-je raté quelque chose?
Mise à JOUR:
Trouvé une limite pour l'un des chiffres qui nous ont été insertion, voici le code:
mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb;
Query OK, 0 rows affected (0.03 sec)
mysql> insert into test value(131071.01);
Query OK, 1 row affected (0.01 sec)
mysql> insert into test value(131072.01);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM test;
+-----------+
| floaty |
+-----------+
| 131071.01 |
| 131072.02 |
+-----------+
2 rows in set (0.00 sec)
mysql>
J'ai vraiment 858147.13 sur ma boîte de windows exécutant MySQL 5.0.67.
OriginalL'auteur Gennadiy | 2009-05-22
Vous devez vous connecter pour publier un commentaire.
Face À La Paume!!!!
Flotteurs sont en 32 bits nombres stockés en tant que mantisse et les exposants. Je ne suis pas 100% sûr de savoir comment MySql va diviser le stockage, mais la prise de Java, comme un exemple, ils utiliseraient 24 bits signé mantisse et 8 bits pour l'exposant (notation scientifique). Cela signifie que la valeur maximale d'un FLOTTEUR peut avoir est de +8388608*10^127 et le minimum est de -8388608*10^127. Cela signifie que 7 chiffres significatifs, et mon FLOAT définition 8.
Nous allons basculer la totalité de ces 8,2 à DOUBLE à partir de FLOTTER.
OriginalL'auteur Gennadiy
MySQL docs mention "MySQL effectue l'arrondissement lors du stockage des valeurs" et je suppose que c'est le problème ici. J'ai dupliqué votre question, mais il a changé le type de stockage à être DOUBLE:
et la valeur récupérée correspondait à la valeur du test que vous avez fournis.
Ma suggestion, pour ce que ça vaut, c'est l'utilisation DOUBLE ou peut-être DÉCIMAL. J'ai essayé la même origine du test:
et il extrait la valeur que je lui est donné: 858147.11.
OriginalL'auteur itsmatt