Mysql
 sql >> Base de données >  >> RDS >> Mysql

Lorsque j'ajoute xx à la colonne mysql float, le résultat est erroné, est-ce un bogue ?

Votre problème a quelque chose à voir avec la taille de votre valeur en virgule flottante, mais je ne sais pas à 100% pourquoi. J'ai testé la mise à jour d'une ligne similaire avec des nombres plus petits et cela a bien fonctionné. Vous devez également vous abstenir d'utiliser des guillemets dans la mesure du possible, car cela nécessite un traitement supplémentaire. Voir cette question SO :mettre à jour une colonne en soustrayant un valeur

Voici ma solution de contournement facile, tout comme Tim Biegeleisen l'a suggéré :

CREATE TABLE `xxx` (
  `uid` int(11) NOT NULL,
  `money` decimal(10,2) NOT NULL DEFAULT '0.00' ,
  `real_money` float(10,2) NOT NULL ,
  `available_invoice` float(10,2) DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

Insérer :

USE dbname;
insert into xxx Values(1234, 99959040.00, 0.00, 99999.00);

Mettre à jour sans chaînes :

update xxx set money = money - 20 where uid = 1234;

Il y a des choses étranges lors du calcul avec de grandes valeurs à virgule flottante. Certains de ces problèmes dépendent de la machine et sont liés au type de processeur dont vous disposez. En savoir plus ici :http://dev.mysql .com/doc/refman/5.7/en/problems-with-float.html

De plus, selon une autre question SO, les valeurs à virgule flottante ne sont PAS un bon moyen de stocker des valeurs monétaires. Différence entre les types de données flottant et décimal (voir la deuxième réponse).

Il semble que l'utilisation de decimal et numeric les types de données sont les meilleurs pour les colonnes d'argent dans mysql.