type - varchar mysql




Meilleur type de données pour stocker des valeurs de devise dans une base de données MySQL (6)

Quel est le meilleur type de données SQL pour les valeurs monétaires? J'utilise MySQL mais préférerais un type indépendant de base de données.


Bien que cela puisse être en retard, mais il sera utile à quelqu'un d'autre. De mon expérience et de la recherche, j'ai appris à connaître et à accepter la décimale (19, 6). C'est quand travailler avec php et mysql. lorsque vous travaillez avec beaucoup d'argent et taux de change


Cela dépend de la nature des données. Vous devez le contempler à l'avance.

Mon cas

  • décimal (13,4) non signé pour l'enregistrement de transactions monétaires
    • stockage efficace (4 octets pour chaque côté de la virgule décimale de toute façon) 1
    • Conforme aux PCGR
  • décimal (19,4) non signé pour les agrégats
    • nous avons besoin de plus d'espace pour les totaux de plusieurs transactions de plusieurs milliards
    • la semi-conformité avec le type de données MS Currency ne nuira pas 2
    • il faudra plus d'espace par enregistrement (11 octets - 7 à gauche et 4 à droite), mais c'est très bien car il y a moins d'enregistrements pour les agrégats 1
  • décimal (10,5) pour les taux de change
    • ils sont normalement cités avec 5 chiffres tout à fait ainsi vous pourriez trouver des valeurs comme 1.2345 et 12.345 mais pas 12345.67890
    • c'est une convention répandue, mais pas une norme codifiée (du moins pour mes connaissances de recherche rapide)
    • vous pouvez le faire décimal (18,9) avec le même stockage, mais les restrictions de type de données sont un mécanisme de validation intégré précieux

Pourquoi (M, 4)?

  • il y a des monnaies qui se sont divisées en mille pennies
  • il y a des équivalents d'argent comme "Unidad de Fermento", "CLF" exprimé avec 4 décimales significatives 3 , 4
  • il est conforme aux PCGR

Troquer

  • plus faible précision:
    • moins de frais de stockage
    • calculs plus rapides
    • risque d'erreur de calcul plus faible
    • sauvegarde et restauration plus rapide
  • une plus grande précision:
    • Compatibilité future (les nombres ont tendance à croître)
    • économies de temps de développement (vous n'aurez pas à reconstruire la moitié d'un système lorsque les limites sont atteintes)
    • réduction du risque d'échec de la production en raison d'une précision de stockage insuffisante

Compatible Extreme

Bien que MySQL vous permette d'utiliser la décimale (65,30), 31 pour l'échelle et 30 pour la précision semblent être nos limites si nous voulons laisser l'option de transfert ouverte.

Échelle maximale et précision dans le SGBDR le plus courant:

            Precision   Scale
Oracle      31          31
T-SQL       38          38
MySQL       65          30
PostgreSQL  131072      16383

6 , 7 , 1 , 9

Extrême raisonnable

  1. Pourquoi (27,4)?
    • on ne sait jamais quand le système doit stocker des dollars zimbabwéens

Septembre 2015 Le gouvernement zimbabwéen a déclaré qu'il échangerait des dollars zimbabwéens contre des dollars américains à un taux de 1 USD à 35 quadrillions de dollars zimbabwéens 5

Nous avons tendance à dire "oui, bien sûr ... je n'aurai pas besoin de ces chiffres fous". Eh bien, les Zimbabwéens avaient l'habitude de le dire aussi. Il n'y a pas longtemps.

Imaginons que vous deviez enregistrer une transaction de 1 million USD en dollars zimbabwéens (peut-être peu probable aujourd'hui, mais qui sait à quoi cela ressemblera dans 10 ans?).

  1. (1 mln USD) * (35 Quadrylion ZWL) = (10 ^ 6) * (35 * 10 ^ 15) = 35 * 10 ^ 21
  2. nous avons besoin:
    • 2 chiffres pour stocker "35"
    • 21 chiffres pour stocker les zéros
    • 4 chiffres à droite du point décimal
  3. cela fait décimal (27,4) qui nous coûte 15 octets pour chaque entrée
  4. nous pouvons ajouter un chiffre de plus à gauche sans frais - nous avons décimal (28,4) pour 15 octets
  5. Maintenant, nous pouvons stocker 10 millions USD de transaction exprimés en dollars zimbabwéens, ou à l'abri d'une autre attaque d'inflation, qui, espérons-le, ne se produira pas

La réponse d'Assaf de

Cela dépend de combien d'argent vous avez ...

ça sonne désinvolte, mais en réalité c'est pertinant.

Seulement aujourd'hui nous avons eu un problème où un enregistrement n'a pas pu être inséré dans notre table Rate, parce que l'une des colonnes (GrossRate) est définie sur Decimal (11,4), et notre département Product vient d'obtenir un contrat pour des chambres à Bora Bora, qui se vendent plusieurs millions de francs du Pacifique par nuit ... quelque chose qui n'a jamais été anticipé lorsque le schéma de la base de données a été conçu il y a 10 ans.



Vous pouvez utiliser quelque chose comme DECIMAL(19,2) par défaut pour toutes vos valeurs monétaires, mais si vous ne stockez que des valeurs inférieures à 1 000 $, cela ne servira à rien d'un précieux espace de base de données.

Pour la plupart des implémentations, DECIMAL(N,2) serait suffisant, où la valeur de N est au moins le nombre de chiffres avant le . de la somme la plus élevée que vous espériez jamais être stockée dans ce domaine + 5 . Donc, si vous ne vous attendez jamais à stocker des valeurs supérieures à 999999.99, DECIMAL(11,2) devrait être plus que suffisant (jusqu'à ce que les attentes changent).

Si vous voulez être compatible avec les GAAP , vous pouvez utiliser DECIMAL(N,4) , où la valeur de N est au moins le nombre de chiffres avant le . de la plus grande somme que vous espérez jamais être stockée dans ce domaine + 7 .


super entrée tardive, mais les PCGR est une bonne règle.

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

Habituellement, vous devriez additionner vos valeurs d'argent à 13,4 avant d'arrondir la sortie à 13,2.

Source: meilleur type de données pour stocker la valeur monétaire dans MySQL





sqldatatypes