Eu tenho um banco de dados que contém dados financeiros armazenados como floats. Naturalmente, isso pode apresentar um problema real em momentos aleatórios (por exemplo, quando há um valor exato que não pode ser aproximado o suficiente com um algoritmo de ponto flutuante).
Minha pergunta é :
- O uso
ALTER TABLE table MODIFY field fixed(10,2)
preservará o valor fixo que é mostrado atualmente pelo MySQL quando você selecionar o campo? - Existe alguma possibilidade do valor ser algo diferente disso?
MÁ NOTÍCIA: Acho que o valor não será preservado!!!
Escrevi este post (25 de julho de 2011) mostrando como os números de ponto flutuante são sensíveis às conversões.
BOAS NOTÍCIAS: Veja como você pode comparar com segurança a conversão de dados:
Se sua mesa tem essas características
moneytable
moneyfield
moneyid
Em seguida, execute estes comandos:
Aqui está o resultado final: se alguma linha voltar da
LEFT JOIN
consulta, a conversão será ruim. Você terá que modificar a definição demoneyfield
, recarregar amoneytabletest
tabela e executar aLEFT JOIN
consulta repetidamente até que nenhuma linha volte daLEFT JOIN
consulta. Quando zero (0) linhas voltarem, você saberá qual conversão será segura.De uma chance !!!
Com base na resposta de Rolando, criei um método mais fácil de fazer uma conversão em etapas e depois comparar. Nas tabelas em questão, adicionei primeiro um novo campo do mesmo tipo. Eu espelhei os valores, executei a conversão e comparei os valores resultantes. por exemplo, para
Amount float(10,2) NOT NULL
eu usei:Surpreendentemente, com várias tabelas (algumas com mais de 30 mil linhas), havia apenas um valor que não correspondia. Felizmente, o sinalizador excluído foi definido nesse registro específico, portanto, era irrelevante de qualquer maneira. Assim, ao obter os resultados favoráveis, a etapa final consistia em dois comandos:
EDIT : A alternativa de tempo de inatividade zero seria descartar a
AmountStaged
coluna e converter aAmount
coluna, pois a conversão deve ser idêntica à que executamos para testar.Obrigado a todas as respostas acima!
Eu tenho mais de 130.972 linhas no total, existem várias colunas flutuantes com dados semelhantes a dinheiro. Então, hoje preciso converter essas colunas em decimal, porque temos alguns problemas com precisão. Usei uma das soluções acima, mas o resultado não foi exatamente o que eu preciso, como disse o autor:
Outro teve sorte e os registros de diferença foram marcados como excluídos ... No meu caso, após essas operações:
... obtive 87 linhas, que não correspondem. Então eu decidi apenas atualizá-lo assim:
Bem, depois disso eu tenho tudo que eu preciso. Todos os dados arredondados
float_price
são iguais adummy_price
, acho que é o suficiente.Acho que vou ajudar alguém.