Ich möchte viele Datensätze in einer MySQL-Datenbank speichern. Alle von ihnen enthalten Geldwerte. Aber ich weiß nicht, wie viele Ziffern für jede eingefügt werden.
Welchen Datentyp muss ich dafür verwenden?
VARCHAR oder INT (oder andere numerische Datentypen)?
mysql
sqldatatypes
currency
Mohammad Saberi
quelle
quelle
deimal(10,2)
ist, was ich benutze ... Sie können die Werte abhängig von der erwarteten Größe anpassenAntworten:
Da Geld eine genaue Darstellung benötigt, verwenden Sie keine Datentypen, die nur ungefähr sind
float
. Sie können dafür einen numerischen Festkomma-Datentyp verwenden15
ist die Genauigkeit (Gesamtlänge des Wertes einschließlich Dezimalstellen)2
ist die Anzahl der NachkommastellenSiehe MySQL Numeric Types :
quelle
decimal
undnumeric
sind gleich.numeric(19,4)
für Finanzunterlagen, mit denen Sie leichter spielen und neue Anfragen problemlos annehmen können.Sie können verwenden
DECIMAL
oderNUMERIC
beide sind gleichdh
DECIMAL(10,2)
Gut gelesen
quelle
Ich bevorzuge es
BIGINT
, die Werte zu verwenden und zu speichern, indem ich sie mit 100 multipliziere , damit sie ganzzahlig werden.Um beispielsweise einen Währungswert von darzustellen
93.49
, wird der Wert als gespeichert9349
, während der Wert angezeigt wird , den wir durch 100 teilen und anzeigen können. Dies belegt weniger Speicherplatz.quelle
DECIMAL
? Sie müssen Pennies in Dollar umrechnen, und wehe, wenn Sie es irgendwann vergessen.$0.005
oder$0.12345
) speichern, da diese nach dem Multiplizieren mit 100 nicht auf eine Ganzzahl reduziert werden. Wenn Sie die Genauigkeit der Werte kennen, ist dies klar beste Option ist zu verwendenDECIMAL
. Aber wenn Sie die Präzision nicht kennen (wie in meinen Beispielen), dann ... wäreFLOAT
das angemessen?Es hängt von Ihren Bedürfnissen ab.
DECIMAL(10,2)
Normalerweise reicht die Verwendung aus, aber wenn Sie etwas genauere Werte benötigen, können Sie diese einstellenDECIMAL(10,4)
.Wenn Sie mit großen Werten arbeiten, ersetzen Sie
10
durch19
.quelle
Wenn Ihre Anwendung Geldwerte bis zu einer Billion verarbeiten muss, sollte dies funktionieren: 13,2 Wenn Sie GAAP (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
Dies hängt in der Tat von den Vorlieben des Programmierers ab. Ich persönlich verwende:
numeric(15,4)
um die allgemein anerkannten Rechnungslegungsgrundsätze ( GAAP ) einzuhalten .quelle
Versuchen Sie es mit
Dies funktioniert normalerweise auch mit jeder anderen Datenbank
quelle
Wir benutzen
double
.*keuchen*
Warum?
Weil es eine beliebige 15-stellige Zahl ohne Einschränkungen für den Dezimalpunkt darstellen kann . Alles für nur 8 Bytes!
So kann es darstellen:
0.123456789012345
123456789012345.0
... und alles dazwischen.
Dies ist nützlich, da es sich um globale Währungen handelt und
double
die verschiedenen Dezimalstellen gespeichert werden können, auf die wir wahrscheinlich stoßen werden.Ein einzelnes
double
Feld kann 999.999.999.999.999 in japanischen Yen, 9.999.999.999.999,99 in US-Dollar und sogar 9.999.999.99999999 in Bitcoins darstellenWenn Sie versuchen, dasselbe mit zu tun
decimal
, benötigen Sie,decimal(30, 15)
was 14 Bytes kostet.Vorsichtsmaßnahmen
Natürlich ist die Verwendung
double
nicht ohne Einschränkungen.Allerdings ist es nicht Genauigkeitsverlust , wie einige darauf hinweisen neigen. Auch wenn
double
es für das Basis-10-System intern möglicherweise nicht genau ist , können wir es genau machen, indem wir den Wert, den wir aus der Datenbank ziehen, auf seine signifikanten Dezimalstellen runden . Bei Bedarf ist das so. (zB Wenn es ausgegeben werden soll und eine Darstellung der Basis 10 erforderlich ist.)Die Einschränkungen sind, dass wir jedes Mal, wenn wir damit rechnen, das Ergebnis normalisieren müssen (indem wir es auf seine signifikanten Dezimalstellen runden), bevor:
Eine andere Art von Einschränkung besteht darin, dass im Gegensatz dazu,
decimal(m, d)
wo die Datenbank verhindert, dass Programme eine Zahl mit mehr alsm
Ziffern einfügen , keine derartigen Überprüfungen vorhanden sinddouble
. Ein Programm könnte einen vom Benutzer eingegebenen Wert von 20 Stellen einfügen und wird dann stillschweigend als ungenauer Betrag aufgezeichnet.quelle
1.410000000000
(zwölf signifikante Dezimalstellen) ist. Wenn Sie diese jedoch mit 1.000.000.000.000 multiplizieren (das sind 13 signifikante Stellen, die vom Dezimalpunkt entfernt sind), arbeiten wir mit at mindestens 25 kombinierte Stellen von Bedeutung. Dies übertrifft die 15, die für ein Doppel verfügbar sind, bei weitem, was das Design betrifft, denke ich, dass es sehr kaputt wäre.Zu der Zeit, als diese Frage gestellt wurde, dachte niemand über den Bitcoin-Preis nach. Im Fall von BTC ist die Verwendung wahrscheinlich nicht ausreichend
DECIMAL(15,2)
. Wenn der Bitcoin auf 100.000 US-Dollar oder mehr steigt, müssen wir mindestensDECIMAL(18,9)
Kryptowährungen in unseren Apps unterstützen.DECIMAL(18,9)
nimmt in MySQL 12 Bytes Speicherplatz in Anspruch ( 4 Bytes pro 9 Ziffern ).quelle
Das Speichern von Geld
BIGINT
multipliziert mit 100 oder mehr mit dem Grund, weniger Speicherplatz zu verbrauchen, macht in allen "normalen" Situationen keinen Sinn.DECIMAL(13,4)
DECIMAL
.DECIMAL(13,4)
repräsentiert 9 Stellen + 4 Bruchstellen (Dezimalstellen) => 4 + 2 Bytes = 6 BytesBIGINT
.quelle
Wenn GAAP-Konformität erforderlich ist oder Sie 4 Dezimalstellen benötigen:
DECIMAL (13, 4) Unterstützt einen Maximalwert von:
999.999.999.9999 USD
Andernfalls, wenn 2 Dezimalstellen ausreichen: DECIMAL (13,2)
src: https://rietta.com/blog/best-data-types-for-currencymoney-in/
quelle
Multipliziert 10000 und speichert als BIGINT, wie "Währung" in Visual Basic und Office. Siehe https://msdn.microsoft.com/en-us/library/office/gg264338.aspx
quelle