OK, donc je sais qu'il y a des tonnes d'articles disant que je ne devrais pas utiliser le DOUBLE pour stocker de l'argent sur une base de données MySQL, ou je vais finir avec une délicate précision de bugs. Le point est que je ne suis pas la conception d'une nouvelle base de données, je me suis demander trouver de façon à optimiser un système existant. La nouvelle version contient 783 DOUBLE tapé colonnes, la plupart d'entre eux utilisés pour stocker de l'argent ou de la formule de calcul montant d'argent.
Donc mon premier avis sur le sujet a été, je devrais vous conseillons fortement de conversion de DOUBLE à VIRGULE dans la prochaine version, parce que la doc MySQL et tout le monde à le dire. Mais alors je ne pouvais pas trouver tout bon argument pour justifier cette recommandation, et ce pour trois raisons :
- Nous n'effectuons pas de calcul sur la base de données. Toutes les opérations sont effectuées en Java à l'aide de BigDecimal, et MySQL est juste utilisé comme un simple stockage des résultats.
- Les 15 chiffres de précision DOUBLE propose est amplement suffisant car nous stockons essentiellement montants avec 2 chiffres après la virgule, et occasionnellement de petits nombres wit 8 chiffres après la virgule pour la formule des arguments.
- Nous avons un 6 années d'expérience en production sans problème connu de bug dû à une perte de précision sur le MySQL côté.
Même en effectuant des opérations sur les 18 millions de lignes de la table, comme la SOMME et le complexe de multiplications, je ne pouvais pas exécuter un bug du manque de précision. Et nous ne sommes pas réellement faire ce genre de choses dans la production. Je peux montrer la précision perdu en faisant quelque chose comme
SELECT columnName * 1.000000000000000 FROM tableName;
Mais je ne peux pas trouver un moyen de le transformer en un bug lors de la 2ème décimale. La plupart des problèmes réels que j'ai trouvé sur internet le sont de 2005 et les anciennes entrées de forum, et je ne pouvais pas reproduire l'un d'eux sur un serveur MySQL 5.0.51.
Donc, tant que nous n'effectuons pas de SQL opérations arithmétiques, dont nous n'avons pas l'intention de le faire, il y a aucune question, nous devons nous attendre à partir de seulement le stockage et la récupération d'un montant d'argent dans une DOUBLE colonne ?