Es scheint, als würde vom Money
Typ abgeraten, wie hier beschrieben
In meiner Anwendung muss die Währung gespeichert werden. Welchen Datentyp soll ich verwenden? Numerisch, Geld oder FLOAT?
Es scheint, als würde vom Money
Typ abgeraten, wie hier beschrieben
In meiner Anwendung muss die Währung gespeichert werden. Welchen Datentyp soll ich verwenden? Numerisch, Geld oder FLOAT?
Antworten:
Numerisch mit erzwungener Genauigkeit von 2 Einheiten. Verwenden Sie niemals float oder float like datatype, um die Währung darzustellen, denn wenn Sie dies tun, werden die Leute unglücklich sein, wenn das Endergebnis des Finanzberichts um + oder - ein paar Dollar falsch ist.
Die Geldart wird, soweit ich das beurteilen kann, nur aus historischen Gründen beibehalten.
scale - precision
numeric(3,2)
wird in der Lage sein, max9.99
3-2 = 1
Ihre Quelle ist in keiner Weise offiziell. Es stammt aus dem Jahr 2011 und ich erkenne nicht einmal die Autoren. Wenn der Geldtyp offiziell "entmutigt" wäre, würde PostgreSQL dies im Handbuch sagen - was es nicht tut .
Für eine offiziellere Quelle lesen Sie diesen Thread in pgsql-general (ab dieser Woche!) Mit Aussagen von Kernentwicklern wie D'Arcy JM Cain (Originalautor des Geldtyps ) und Tom Lane:
Verwandte Antwort (und Kommentare!) Zu Verbesserungen in den letzten Versionen:
Grundsätzlich money
hat seine (sehr begrenzte) Verwendung. Das Postgres-Wiki schlägt vor, es weitgehend zu vermeiden, mit Ausnahme der eng definierten Fälle. Der Vorteil gegenüber numeric
ist die Leistung .
decimal
ist nur ein Alias für numeric
in Postgres und wird häufig für Gelddaten verwendet, da es sich um einen Typ mit "willkürlicher Genauigkeit" handelt. Das Handbuch :
Der Typ
numeric
kann Nummern mit einer sehr großen Anzahl von Ziffern speichern. Es wird insbesondere zur Aufbewahrung von Geldbeträgen und anderen Mengen empfohlen, bei denen Genauigkeit erforderlich ist.
Persönlich mag ich es, Währung als integer
Repräsentation von Cent zu speichern, wenn gebrochene Cent niemals auftreten (im Grunde genommen, wo Geld Sinn macht). Das ist effizienter als jede andere der genannten Optionen.
money
Typ tatsächlich veraltet war. Probleme wurden behoben und der Typ wurde in späteren Versionen wieder hinzugefügt. Persönlich mag ich es, Währung als integer
Repräsentant von Cent zu speichern .
Sie haben folgende Möglichkeiten:
bigint
: Speichern Sie den Betrag in Cent. Dies ist, was EFTPOS-Transaktionen verwenden.decimal(12,2)
: Speichern Sie den Betrag mit genau zwei Dezimalstellen. Dies wird von den meisten Hauptbuchsoftware verwendet.float
: schreckliche Idee - unzureichende Genauigkeit. Dies ist, was naive Entwickler verwenden.Option 2 ist die häufigste und am einfachsten zu handhabende Option. Stellen Sie die Genauigkeit (12 in meinem Beispiel, dh insgesamt 12 Stellen) so groß oder klein ein, wie es für Sie am besten funktioniert.
Beachten Sie, dass die Genauigkeit höher sein sollte, um einen genauen Makrowert bereitzustellen, wenn Sie mehrere Transaktionen, die das Ergebnis einer Berechnung waren (z. B. mit einem Wechselkurs), zu einem einzigen Wert zusammenfassen, der geschäftliche Bedeutung hat. Verwenden Sie so etwas wie, decimal(18, 8)
damit die Summe genau ist und die einzelnen Werte für die Anzeige auf Cent gerundet werden können.
numeric(15,4)
oder numeric(15,6)
ist eine gute Idee.
Ich behalte alle meine Geldfelder wie folgt:
numeric(15,6)
Es scheint übertrieben, so viele Dezimalstellen zu haben, aber wenn es auch nur die geringste Chance gibt, dass Sie mit mehreren Währungen umgehen müssen, benötigen Sie so viel Präzision für die Umrechnung. Egal, was ich einem Benutzer präsentiere, ich speichere immer in US-Dollar. Auf diese Weise kann ich angesichts des Umrechnungskurses für den jeweiligen Tag problemlos in jede andere Währung umrechnen.
Wenn Sie nie etwas anderes als eine Währung tun, ist das Schlimmste hier, dass Sie ein wenig Platz verschwendet haben, um einige Nullen zu speichern.
bigint
Ich empfehle die Verwendung von Mikrodollar (oder einer ähnlichen Hauptwährung). Mikro bedeutet 1 Millionstel, also 1 Mikrodollar = 0,000001 USD.
numeric(15,6)
schlug dies in einer anderen Antwort vor?
bigint
. Es gibt developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…, aber es bietet (vorerst) nur eingeschränkte Unterstützung und Einschränkungen (z. B. können Sie es bei der Währungsumrechnung nicht einfach mit einem Float multiplizieren). . Angesichts der Tatsache, dass das Maximum, das Sie mit Mikrodollar in einer JS-Ganzzahl speichern können, 9 Milliarden US-Dollar beträgt, ist dies in den meisten Fällen wahrscheinlich immer noch gut.
Verwenden Sie BigInt
diese Option , um die Währung als positive Ganzzahl zu speichern, die den Geldwert in der kleinsten Währungseinheit darstellt (z. B. 100 Cent zum Speichern von 1,00 USD oder 100 zum Speichern von 100 Yen (japanischer Yen, eine Währung mit null Dezimalstellen). Dies ist, was Stripe tut - eine die wichtigsten Finanzdienstleistungsunternehmen für den globalen E-Commerce.