Twój problem ma coś wspólnego z tym, jak duża jest twoja wartość zmiennoprzecinkowa, ale nie jestem w 100% pewien, dlaczego. Przetestowałem aktualizację podobnego wiersza mniejszymi numerami i działało dobrze. Powinieneś również powstrzymać się od używania cudzysłowów tam, gdzie to możliwe, ponieważ wymaga to dodatkowego przetwarzania. Zobacz to pytanie SO:zaktualizuj kolumnę, odejmując wartość
Oto moje proste obejście, tak jak sugerował Tim Biegeleisen:
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;
Wstaw:
USE dbname;
insert into xxx Values(1234, 99959040.00, 0.00, 99999.00);
Aktualizacja bez ciągów:
update xxx set money = money - 20 where uid = 1234;
Przy obliczaniu dużych wartości zmiennoprzecinkowych są pewne dziwne rzeczy. Niektóre z tych problemów są zależne od komputera i związane z typem posiadanego procesora. Przeczytaj więcej tutaj:http://dev.mysql .com/doc/refman/5.7/en/problems-with-float.html
Ponadto, zgodnie z innym pytaniem SO, wartości zmiennoprzecinkowe NIE są dobrym sposobem na przechowywanie wartości pieniężnych. Różnica między typem danych zmiennoprzecinkowych i dziesiętnych (patrz druga odpowiedź).
Wygląda na to, że użycie decimal
i numeric
typy danych są najlepsze dla kolumn pieniędzy w mysql.