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.