wake-up-neo.com

Bester Datentyp zum Speichern von Geldwerten in MySQL

Ich möchte viele Datensätze in einer MySQL-Datenbank speichern. Alle enthalten Geldwerte. Ich weiß jedoch nicht, wie viele Ziffern für jede eingegeben werden.
Welchen Datentyp muss ich dafür verwenden?
VARCHARoderINT(oder andere numerische Datentypen)?

237
Mohammad Saberi

Da Geld eine exakte Darstellung benötigt, verwenden Sie keine Datentypen, die nur annähernd wie float sind. Sie können für diesen Vorgang einen numerischen Festkomma-Datentyp verwenden

decimal(15,2)
  • 15 ist die Genauigkeit (Gesamtlänge des Wertes einschließlich Dezimalstellen)
  • 2 ist die Anzahl der Nachkommastellen

Siehe MySQL Numeric Types :

Diese Typen werden verwendet, wenn es wichtig ist, die exakte Genauigkeit beizubehalten, beispielsweise mit monetären -Daten.

319
juergen d

Sie können DECIMAL oder NUMERIC verwenden. Beide sind gleich 

Die Typen DECIMAL und NUMERIC speichern genaue numerische Datenwerte. Diese Typen werden verwendet, wenn es wichtig ist, die exakte Genauigkeit beizubehalten, beispielsweise bei monetären Daten. In MySQL ist NUMERIC als DECIMAL implementiert, daher gelten die folgenden Anmerkungen zu DECIMAL für NUMERIC. : MySQL

d. h.DECIMAL(10,2)

Example settings

Gute Lektüre

82
NullPoiиteя

Ich bevorzuge die Verwendung von BIGINT und speichere die Werte in mit multiply mit 100, so dass es zu einer Ganzzahl wird. 

Um beispielsweise einen Währungswert von 93.49 darzustellen, wird der Wert als 9349 gespeichert, während der Wert angezeigt wird, den wir dividieren durch 100 und anzeigen können. Dies nimmt weniger Speicherplatz in Anspruch.

Vorsicht:
Meistens führen wir keine currency * currency-Multiplikation durch. Falls dies der Fall ist, teilen Sie das Ergebnis mit 100 und speichern es, damit es wieder die richtige Genauigkeit erhält.

28
Dinesh P.R.

Das hängt von Ihrem Bedarf ab.

Die Verwendung von DECIMAL(10,2) ist normalerweise ausreichend. Wenn Sie jedoch genauere Werte benötigen, können Sie DECIMAL(10,4) einstellen.

Wenn Sie mit großen Werten arbeiten, ersetzen Sie 10 durch 19.

26
Svetoslav

Wenn Ihre Anwendung mit Geldwerten bis zu einer Billion umgehen muss, sollte dies funktionieren: 13,2 Wenn Sie die GAAP-Grundsätze (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.

13
david.ee

In der Tat hängt dies von den Präferenzen des Programmierers ab. Ich persönlich verwende: numeric(15,4), um die allgemein anerkannten Rechnungslegungsgrundsätze (GAAP) zu erfüllen.

5
Chagbert

Als diese Frage gestellt wurde, dachte niemand über den Bitcoin-Preis nach. Im Falle von BTC reicht es wahrscheinlich nicht aus, DECIMAL(15,2) zu verwenden. Wenn der Bitcoin-Wert auf 100.000 USD oder mehr steigt, benötigen wir mindestens DECIMAL(18,9), um Kryptowährungen in unseren Apps zu unterstützen.

DECIMAL(18,9) benötigt in MySQL 12 Bytes ( 4 Bytes pro 9 Ziffern ).

3
bizwiz

Versuchen Sie es mit

Decimal(19,4)

dies funktioniert normalerweise auch mit jeder anderen Datenbank

3
Deepesh

Wir verwenden double.

* keuchen *

Warum?

Weil es eine beliebige 15-stellige Zahl darstellen kann, wobei der Dezimalpunkt nicht festgelegt ist. Alles für märchenhafte 8 Bytes!

So kann es darstellen:

  • 0.123456789012345
  • 123456789012345.0

... und irgendetwas dazwischen.

Dies ist nützlich, weil wir es mit globalen Währungen zu tun haben und double die verschiedenen Dezimalstellen speichern können, die uns wahrscheinlich begegnen.

Ein einzelnes double-Feld kann 999.999.999.999.999s in japanischen Yens, 9.999.999.999.999.99s in US-Dollar und sogar 9.999.999.99999999s in Bitcoins darstellen

Wenn Sie versuchen, dasselbe mit decimal zu tun, benötigen Sie decimal(30, 15), was 14 Byte kostet.

Vorsichtsmaßnahmen

Natürlich ist die Verwendung von double nicht ohne Vorbehalte.

Allerdings ist es ist nicht ein Verlust an Genauigkeit, wie manche darauf hinweisen. Auch wenn double selbst möglicherweise nicht intern zum Basis-10-System genau ist [], können wir es genau machen, indem Sie den Wert runden wir aus der Datenbank auf die signifikanten Dezimalstellen ziehen. Bei Bedarf ist das so. (z. B. Wenn es ausgegeben wird, ist eine Darstellung der Basis 10 erforderlich.)

Die Vorbehalte sind, jedes Mal, wenn wir mit ihm arithmetisch arbeiten, müssen wir das Ergebnis normalisieren (indem wir es auf seine signifikanten Dezimalstellen runden), bevor:

  1. Vergleiche daran durchführen.
  2. Schreiben Sie es zurück in die Datenbank.

Eine andere Einschränkung ist, dass im Gegensatz zu decimal(m, d) die Datenbank das Einfügen einer Zahl mit mehr als m-Ziffern verhindert, so dass mit double keine solchen Validierungen vorhanden sind. Ein Programm könnte einen vom Benutzer eingegebenen Wert von 20 Ziffern einfügen und wird am Ende als ungenauer Betrag aufgezeichnet.

2
antak

Das Speichern von Geld als BIGINT multipliziert mit 100 oder mehr mit dem Grund, weniger Speicherplatz zu verwenden, macht in allen "normalen" Situationen keinen Sinn.

  • Um mit GAAP in Einklang zu bleiben, ist es ausreichend, Währungen in DECIMAL(13,4) zu speichern.
  • Das MySQL-Handbuch liest, dass es 4 Bytes pro 9 Stellen benötigt, um DECIMAL. Zu speichern.
  • DECIMAL(13,4) steht für 9 Stellen + 4 Nachkommastellen => 4 + 2 Bytes = 6 Bytes
  • vergleichen Sie mit 8 Bytes, die zum Speichern von BIGINT erforderlich sind.
1
digitalstraw

Multipliziert 10000 und speichert als BIGINT, wie "Currency" in Visual Basic und Office. Siehe https://msdn.Microsoft.com/de-de/library/office/gg264338.aspx

0
auntyellow