361 votes

Meilleur type de données pour stocker les valeurs monétaires dans MySQL

Je veux stocker de nombreux enregistrements dans une base de données MySQL. Tous ces enregistrements contiennent des valeurs monétaires. Mais je ne sais pas combien de chiffres seront insérés pour chacun d'eux.
Quel type de données dois-je utiliser à cette fin ?
VARCHAR o INT (ou d'autres types de données numériques) ?

21 votes

deimal(10,2) C'est ce que j'utilise ... vous pouvez ajuster les valeurs en fonction de la taille attendue.

9 votes

La question connexe est Meilleur type de données pour les devises ;).

492voto

juergen d Points 85039

Puisque l'argent a besoin d'une représentation exacte, n'utilisez pas de types de données qui ne sont qu'approximatifs comme float . Vous pouvez utiliser un type de données numériques à virgule fixe pour cela, par exemple

decimal(15,2)
  • 15 est la précision (longueur totale de la valeur, y compris les décimales)
  • 2 est le nombre de chiffres après le point décimal

Ver Types numériques MySQL :

Ces types sont utilisés lorsqu'il est important de préserver la précision exacte, par exemple avec monétaire données.

3 votes

Quelle pourrait être la différence entre le type de données décimal et numérique dans ce cas ?

65 votes

Dans MySQL decimal y numeric sont les mêmes.

32 votes

J'utilise personnellement numeric(19,4) pour les dossiers financiers qui vous donne une meilleure main pour jouer et adopter facilement de nouvelles demandes.

94voto

NullPoiиteя Points 23754

Vous pouvez utiliser DECIMAL o NUMERIC les deux sont identiques

Les types DECIMAL et NUMERIC stockent des valeurs de données numériques exactes. Ces types sont utilisés lorsqu'il est important de préserver la précision exacte, par exemple pour les données monétaires. Dans MySQL, NUMERIC est implémenté comme DECIMAL, donc les remarques suivantes concernant DECIMAL s'appliquent également à NUMERIC : MySQL

c'est-à-dire DECIMAL(10,2)

Example settings

Bonne lecture

3 votes

Peut-être que cela prête à confusion, mais votre capture d'écran ne correspond pas au texte de votre réponse (précision, échelle).

0 votes

J'utilise decimal(10,2) pour la valeur de l'argent, mais lorsque je mets quelque chose comme 867 000,00, il est enregistré sous la forme 867.

44voto

Dinesh P.R. Points 740

Je préfère utiliser BIGINT et stocker les valeurs dans multiplier par 100 pour qu'il devienne entier.

Par exemple, pour représenter une valeur monétaire de 93.49 la valeur est stockée sous la forme 9349 tout en affichant la valeur, nous pouvons diviser par 100 et l'affichage. Cela occupera moins d'espace de stockage.

Attention :
La plupart du temps, nous ne faisons pas currency * currency multiplication, dans le cas où nous le faisons alors diviser le résultat avec 100 et stocker, de sorte qu'il retourne à la précision appropriée.

1 votes

Je me souviens qu'un professeur de mon cours universitaire sur les systèmes informatiques m'a dit une chose similaire. On m'a appris que la méthode la plus précise consistait à stocker en pennies (ou en cents), à les multiplier par 100, à les enregistrer sous forme de nombre entier et à les diviser par 100 pour les afficher à l'utilisateur. Je suppose que cela présente des avantages en termes de précision et de performance du système de base de données.

0 votes

Je pense, c'est un Scale Removing Method qui enlève le souci de changer l'échelle par le pays - par exemple, se produit quand un 1020(X).03(x) change à 10(x).2003(x)- que Juste UI devrait changer ;).

21 votes

Quel est l'avantage par rapport à DECIMAL ? Vous créez un besoin de traduire les centimes en dollars, et malheur si vous l'oubliez à un moment donné.

29voto

Svetlio Points 3123

Cela dépend de vos besoins.

Utilisation de DECIMAL(10,2) est généralement suffisant mais si vous avez besoin de valeurs un peu plus précises vous pouvez définir DECIMAL(10,4) .

Si vous travaillez avec de grandes valeurs, remplacez 10 con 19 .

0 votes

J'utilise decimal(10,2) pour la valeur de l'argent, mais lorsque je mets quelque chose comme 867 000,00, il est enregistré sous la forme 867.

2 votes

@codeinprogress Vous utilisez le mauvais séparateur local/décimal ?

2 votes

@codeinprogress Vous utilisez le , pour le regroupement des chiffres. Ne faites pas cela. N'utilisez jamais la virgule ou le point pour regrouper les chiffres.

18voto

david.ee Points 41

Si votre application doit gérer des valeurs monétaires allant jusqu'à un trillion, cela devrait fonctionner : 13,2 Si vous devez vous conformer aux GAAP (principes comptables généralement acceptés), utilisez : 13,4

En général, vous devriez additionner vos valeurs monétaires à 13,4 avant d'arrondir le résultat à 13,2.

6 votes

Si vous utilisez le bitcoin, vous aurez besoin de 8 décimales, bien que la plupart des portefeuilles utilisent le mBTC, qui correspond à 3 décimales. fr.wikipedia.org/wiki/Bitcoin

0 votes

Je ne pense pas que cette réponse soit vraie. opendata.stackexchange.com/a/10348/13983 @david.ee a une source pour ça ?

0 votes

@EvanCarroll laissez-moi répondre pour david.ee. Je pense que cet article peut être la source rietta.com/blog/2012/03/03/best-data-types-for-currencymoney-in

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X