MySQL champ décimal Données tronquées pour la colonne x à la ligne 1 problème de
J'ai une table mysql avec une décimale(16,2). Semble que l'opération d'addition avec un chiffre après la virgule(16,2) champ de chaîne peut provoquer la Data truncated for column x at row 1
question, qui soulève une exception dans mon projet django.
Je suis conscient de la multiplication ou de la division de fonctionnement de ce champ qui peut provoquer ce problème car le résultat est probablement pas adaptée au format décimal(16,2) de la définition, mais ne l'addition et de la soustraction de l'opération de la même manière?
Mon serveur MySQL version est 5.5.37-0ubuntu0.14.04.1
. Vous pouvez reproduire ce problème du soufflet:
mysql> drop database test;
Query OK, 1 row affected (0.10 sec)
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> create table t(price decimal(16,2));
Query OK, 0 rows affected (0.16 sec)
mysql> insert into t values('2004.74');
Query OK, 1 row affected (0.03 sec)
mysql> select * from t;
+---------+
| price |
+---------+
| 2004.74 |
+---------+
1 row in set (0.00 sec)
mysql> update t set price = price + '0.09';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update t set price = price + '0.09';
Query OK, 1 row affected, 1 warning (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> show warnings;
+-------+------+--------------------------------------------+
| Level | Code | Message |
+-------+------+--------------------------------------------+
| Note | 1265 | Data truncated for column 'price' at row 1 |
+-------+------+--------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from t;
+---------+
| price |
+---------+
| 2004.92 |
+---------+
1 row in set (0.00 sec)
OriginalL'auteur yc. | 2014-05-29
Vous devez vous connecter pour publier un commentaire.
Il y a deux problèmes:
Vous n'êtes pas stocker les valeurs décimales, vous essayez de stocker chaîne/varchar, qui est converti en double valeur par mysql, pour l'exemple de code suivant ne donnent pas d'erreurs
update t set price = price + 0.09;
(même exécuté plusieurs fois)De toute façon ce code donne prévu d'avertissement (numéro de note)
update t set price = price + 0.091;
vous pouvez la changer enupdate t set price = price + cast(0.091 as decimal(16,2));
de cours avec cast, vous pouvez utiliser les valeurs de chaîne tropupdate t set price = price + cast('0.09' as decimal(16,2));
Alors...quelles sont les chances que nous pouvons obtenir ce ORM de Django correction d'un bug?
J'ai eu un problème similaire. Il me semble que si le problème est à l'intérieur de la base de la couche, où en interne convertit vos paramètres d'une chaîne de caractères (indépendamment du fait que vous passer une Virgule, un flotteur ou une chaîne de caractères), puis la mise en garde semble être donné lorsqu'il convertit la chaîne de caractères dans la représentation décimale.
OriginalL'auteur Iłya Bursov
Dans mon cas, le problème se produit lorsque j'essaie d'insérer une décimale à 3 chiffres après le point comme: 0.xxx sur une colonne définie comme DECIMAL(10,2)
Je l'ai changé pour DÉCIMAL(10,3) OU utilisé php pour entrer des valeurs de 0.xx sur DECIMAL(10,2) tableau
OriginalL'auteur Tarik