it-swarm.com.de

Bester Datentyp zum Speichern von Währungswerten in einer MySQL-Datenbank

Was ist der beste SQL-Datentyp für Währungswerte? Ich verwende MySQL, würde aber einen datenbankunabhängigen Typ bevorzugen.

201
Brian Fisher

So etwas wie Decimal(19,4) funktioniert in den meisten Fällen ziemlich gut. Sie können die Skalierung und Genauigkeit an die Anforderungen der zu speichernden Zahlen anpassen. Sogar in SQL Server neige ich dazu, "money" nicht zu verwenden, da dies nicht standardgemäß ist.

222
Kibbee

Das einzige, was Sie beachten müssen, ist, wenn Sie von einer Datenbank zu einer anderen wechseln, stellen Sie möglicherweise fest, dass DECIMAL (19,4) und DECIMAL (19,4) verschiedene Dinge bedeuten

( http://dev.mysql.com/doc/refman/5.1/de/precision-math-decimal-changes.html )

 DBASE: 10,5 (10 ganze Zahl, 5 Dezimalstellen) 
 MYSQL: 15,5 (15 Ziffern, 10 Integer (15-5), 5 Dezimalstellen) 
47
SeanJA

Assafs Antwort von 

Kommt drauf an, wie viel Geld du bekommen hast ...

klingt flippig, aber eigentlich ist es wichtig.

Erst heute hatten wir ein Problem, bei dem ein Datensatz nicht in unsere Kurstabelle eingefügt wurde, weil eine der Spalten (GrossRate) auf Dezimal (11,4) gesetzt ist und unsere Produktabteilung gerade einen Vertrag für Zimmer in einem erstaunlichen Resort erhielt in Bora Bora, die für mehrere Millionen Pazifik-Francs pro Nacht verkauft werden ... etwas, das niemals vorgetäuscht wurde, als das Datenbankschema vor 10 Jahren entworfen wurde.

17
Scott Ferguson

Es ist auch wichtig zu ermitteln, wie viele Dezimalstellen für Ihre Berechnungen erforderlich sind. 

Ich habe an einem Aktienkursantrag gearbeitet, der die Berechnung des Preises von einer Million Aktien erforderte. Der notierte Aktienkurs musste mit einer Genauigkeit von 7 Stellen gespeichert werden.

17
Leah

Für Buchhaltungsanwendungen ist es üblich, die Werte als Ganzzahlen zu speichern (einige sagen sogar, es sei der only - Weg). Um sich ein Bild zu machen, nehmen Sie die Anzahl der Transaktionen (etwa 100,23 $) und ein Vielfaches von 100, 1000, 10000 usw., um die Genauigkeit zu erhalten, die Sie benötigen. Wenn Sie also nur Cent einlagern müssen und sicher auf- oder abrunden können, multiplizieren Sie einfach mit 100. In meinem Beispiel würde das 10023 als ganze Zahl für die Speicherung machen. Sie sparen Platz in der Datenbank und der Vergleich von zwei Ganzzahlen ist viel einfacher als der Vergleich von zwei Gleitkommazahlen. Meine $ 0,02.

10
Dane Bendixen

super spät, aber GAAP ist eine gute Faustregel ..

Wenn Ihre Anwendung mit Geldwerten bis zu einer Billion umgehen muss, sollte dies funktionieren: 13,2 Wenn Sie die GAAP-Richtlinien (General Accepted Accounting Principles) einhalten müssen, verwenden Sie: 13,4

Normalerweise sollten Sie Ihre Geldwerte bei 13,4 summieren, bevor Sie die Ausgabe auf 13,2 runden.

Quelle: Bester Datentyp zum Speichern von Geldwerten in MySQL

8
Damian

Sie können für alle Geldwerte standardmäßig DECIMAL(19,2) verwenden. Wenn Sie jedoch nur Werte unter 1.000 US-Dollar speichern, ist dies nur eine Verschwendung von wertvollem Datenbankplatz.

Für die meisten Implementierungen wäre DECIMAL(N,2) ausreichend, wobei der Wert von N mindestens die Anzahl der Stellen vor dem . der größten Summe ist, die Sie je in diesem Feld + 5 gespeichert haben. Wenn Sie also niemals erwarten, Werte größer als 999999.99 zu speichern, sollte DECIMAL(11,2) mehr als ausreichend sein (bis sich die Erwartungen ändern).

Wenn Sie GAAP kompatibel sein möchten, können Sie mit DECIMAL(N,4) fortfahren, wobei der Wert von N mindestens die Anzahl der Stellen vor dem . der größten Summe ist, die Sie jemals erwartet haben dieses Feld + 7.

5
John Slegers

Das hängt von der Art der Daten ab. Sie müssen vorher darüber nachdenken. 

Mein Fall

  • dezimal (13,4) unsigniert für die Aufzeichnung von Geldtransaktionen
    • speichereffizient (4 Bytes für jede Dezimalpunktseite) 1
    • GAAP-konform 
  • dezimal (19,4) ohne Vorzeichen für Aggregate
    • wir brauchen mehr Platz für mehrere Milliarden Transaktionen
    • semi-Compliance mit dem Datentyp "MS Currency" schadet nicht 2
    • pro Datensatz wird mehr Speicherplatz benötigt (11 Bytes - 7 links und 4 rechts), dies ist jedoch in Ordnung, da weniger Datensätze für Aggregate vorhanden sind 1
  • dezimalzahl (10,5) für Wechselkurse
    • sie werden normalerweise mit 5 Ziffern angegeben, so dass Sie Werte wie 1,2345 und 12,345 finden können, aber nicht 12345.67890
    • es ist weitverbreitete Konvention, aber kein kodifizierter Standard (zumindest für mein schnelles Suchwissen)
    • sie könnten es mit dem gleichen Speicher als dezimal (18,9) machen, aber die Datentypeinschränkungen sind wertvolle integrierte Überprüfungsmechanismen

Warum (M, 4)?

  • es gibt Währungen, die in tausend Pfennige aufgeteilt sind 
  • es gibt Geldäquivalente wie "Unidad de Fermento", "CLF", ausgedrückt mit 4 signifikanten Dezimalstellen 3 , 4
  • es ist GAAP-konform

Abtausch

  • geringere Genauigkeit:
    • geringere Lagerkosten
    • schnellere Berechnungen
    • geringeres Fehlerrisiko bei Berechnungen
    • schnellere Sicherung und Wiederherstellung
  • höhere Genauigkeit:
    • zukünftige Kompatibilität (Zahlen neigen dazu zu wachsen)
    • entwicklungszeitersparnis (Sie müssen kein halbes System neu aufbauen, wenn die Grenzwerte erreicht sind)
    • geringere Gefahr von Produktionsausfällen aufgrund ungenügender Lagerungsgenauigkeit

Kompatibel mit Extreme

Obwohl Sie in MySQL Dezimalzahlen (65,30) verwenden können, scheinen 31 für die Skalierung und 30 für die Genauigkeit unsere Grenzen zu sein, wenn wir die Übertragungsoption offen lassen möchten.

Maximale Skalierung und Präzision in den meisten gängigen RDBMS:

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

6 , 7 , 8 , 9

Vernünftiges Extrem

  1. Warum (27,4)?
    • sie wissen nie, wann das System simbabwische Dollar einlagern muss

Die simbabwische Regierung hat im September 2015 angekündigt, dass sie den simbabwischen Dollar gegen US-Dollar zu einem Preis von 1 USD bis 35 Billiarden simbabwischen Dollar eintauschen werde. 5

Wir neigen dazu, "ja, sicher ... ich werde diese verrückten Figuren nicht brauchen". Nun, die Simbabwer sagten das auch. Vor nicht allzu langer Zeit.

Stellen wir uns vor, Sie müssen eine Transaktion in Höhe von 1 Mio. USD in Zimbabwe-Dollar aufzeichnen (vielleicht heute unwahrscheinlich, aber wer weiß, wie das in 10 Jahren aussehen wird?). 

  1. (1 Mio. USD) * (35 Quadrylion ZWL) = (10 ^ 6) * (35 * 10 ^ 15) = 35 * 10 ^ 21
  2. wir brauchen:
    • 2 Ziffern zum Speichern von "35"
    • 21 Ziffern zum Speichern der Nullen
    • 4 Stellen rechts vom Dezimalpunkt
  3. dies ergibt eine Dezimalzahl (27,4), die 15 Bytes für jeden Eintrag kostet
  4. wir können eine weitere Ziffer links hinzufügen, ohne Kosten - wir haben Dezimalzahl (28,4) für 15 Bytes 
  5. Jetzt können wir eine 10-Millionen-Dollar-Transaktion in simbabwischen Dollar speichern oder vor einem weiteren Hiper-Inflationsangriff schützen, was hoffentlich nicht passieren wird
2
kshishkin

Dies mag zwar spät sein, aber es wird für jemand anderen hilfreich sein. Aus meiner Erfahrung und meinen Forschungen habe ich die Dezimalzahl (19, 6) gelernt und akzeptiert. Das ist bei der Arbeit mit PHP und MySQL. wenn mit viel Geld und Wechselkurs gearbeitet wird

0
precious