Seu problema tem algo a ver com o tamanho do seu valor de ponto flutuante, mas não tenho 100% de certeza do porquê. Eu testei atualizar uma linha semelhante com números menores e funcionou bem. Você também deve evitar usar aspas sempre que possível, pois requer processamento extra. Veja esta pergunta SO:atualize uma coluna subtraindo um valor
Aqui está minha solução fácil, assim como Tim Biegeleisen sugeriu:
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;
Inserir:
USE dbname;
insert into xxx Values(1234, 99959040.00, 0.00, 99999.00);
Atualização sem strings:
update xxx set money = money - 20 where uid = 1234;
Existem algumas coisas estranhas ao calcular com grandes valores de ponto flutuante. Alguns desses problemas dependem da máquina e estão relacionados ao tipo de processador que você possui. Leia mais aqui:http://dev.mysql .com/doc/refman/5.7/en/problems-with-float.html
Além disso, de acordo com outra pergunta SO, os valores de ponto flutuante NÃO são uma boa maneira de armazenar valores monetários. Diferença entre o tipo de dados float e decimal (veja a segunda resposta).
Parece que usar
decimal
e numeric
tipos de dados são melhores para colunas de dinheiro no mysql.