Featured image of post Währungen in der Datenbank speichern: Sollten Sie DECIMAL oder BIGINT verwenden?

Währungen in der Datenbank speichern: Sollten Sie DECIMAL oder BIGINT verwenden?

Wenn Sie ein Zahlungssystem entwickeln, welchen Feldtyp sollten Sie für Währungen verwenden? Dieser Artikel erklärt, warum Sie FLOAT absolut niemals verwenden sollten, und wie Sie zwischen DECIMAL und BIGINT wählen, um ein fehlerfreies, hochleistungsfähiges System zur Währungsspeicherung aufzubauen.

Haben Sie bei der Entwicklung von Zahlungs- oder E-Commerce-Systemen jemals in Betracht gezogen, FLOAT oder DOUBLE für Datenbank-Betragsfelder zu verwenden?

Wenn ja, hören Sie sofort damit auf! Ihr System könnte heimlich Geld verlieren.

Warum sind Gleitkommazahlen in Finanzsystemen verboten? Ein scheinbar unbedeutender Präzisionsfehler, der sich über massive Transaktionsvolumina und Zeit ansammelt, könnte zu irreversiblen Katastrophen führen.

Also, was genau sollten wir verwenden, um Geld zu speichern?

Warum ist FLOAT toxisch für Finanzsysteme?

In der Computerwelt werden Zahlen binär dargestellt. FLOAT (Gleitkommazahlen) ist bei der Darstellung bestimmter Dezimalbrüche eigentlich nur eine “Annäherung”. Es ist, als würde man versuchen, einen zarten Kuchen mit einer groben Kettensäge zu schneiden; egal wie vorsichtig man ist, es fallen immer ein paar Krümel an den Rändern ab.

Das klassische Beispiel ist: 0.1 + 0.2 ist in einem Computer oft nicht gleich 0.3. Wenn Sie Millionen von Transaktionen verarbeiten, häufen sich diese winzigen Fehler von “0.00000000000000004” an, und die Geschäftsbücher werden niemals übereinstimmen. Denken Sie daran:

Wenn es um Geld geht, ist jede “Annäherung” eine Katastrophe.

Das präzise Kassenbuch des Buchhalters: Die Vorteile von DECIMAL

Wenn Sie eine exakte Lösung wollen, bei der “man bekommt, was man sieht”, ist DECIMAL die native Festkommazahl (fixed-point number) der Datenbank und der Branchenstandard.

DECIMAL ist wie das exquisite Kassenbuch in den Händen eines Buchhalters; es trennt ganze Zahlen und Dezimalzahlen präzise und stellt sicher, dass 0.1 + 0.2 absolut gleich 0.3 ist.

Der Goldene Schnitt der Branche: DECIMAL(19, 4)

Wir empfehlen generell die Verwendung von DECIMAL(19, 4):

  • 19: Steht für eine Gesamtkapazität von 19 Ziffern (Präzision).
  • 4: Bedeutet die Beibehaltung von 4 Ziffern nach dem Komma.

Warum 4 Nachkommastellen beibehalten? Weil bei Berechnungen von Zinsen, Steuersätzen oder Wechselkursen die Zwischenschritte oft mehr als 2 Nachkommastellen ergeben. Das Reservieren von 2 zusätzlichen Pufferziffern erhöht die Berechnungsgenauigkeit, und Sie können am Ende einfach nach geschäftlichen Erfordernissen runden.

Diese Kapazität ist sogar groß genug, damit Sie das gesamte BIP mehrerer Erden kaufen könnten!

Ist es ausreichend für reale Finanzszenarien?

Nehmen wir DECIMAL(19, 4) als Beispiel:

  • Ganzzahlige Ziffern: 15 Ziffern
  • Maximaler Betrag: 999.999.999.999.999
  • USD Umrechnung: Ca. 999 Billionen USD
Referenz Betrag
US-BIP Ca. 27 Billionen USD
Gesamtes globales BIP Ca. 105 Billionen USD
Gesamtes globales Vermögen Ca. 454 Billionen USD

DECIMAL(19, 4) kann Zahlen aufnehmen, die den gesamten globalen Reichtum weit übersteigen, was für die überwiegende Mehrheit von Finanzsystemen vollkommen ausreichend ist.

Maximale DECIMAL-Präzisionsgrenzen, die von großen Datenbanken unterstützt werden

Datenbank Maximale Präzision
MySQL / MariaDB 65
PostgreSQL 131072 (Ganzzahlige Ziffern) + 16383 (Dezimalziffern)
SQL Server 38
Oracle 38

Der Arcade-Token-Automat: Die Methode der kleinsten BIGINT-Einheit

Wenn Sie nach ultimativer Leistung streben, oder wenn Ihr System ultrahohe Anforderungen an die Nebenläufigkeit (Concurrency) wie Stripe oder Alipay hat, dann könnte BIGINT (Ganzzahl-Speichermethode) Ihre erste Wahl sein.

Dieser Ansatz ist wie der Token-Automat in einer Spielhalle: Egal, wie viel Geld man einwirft, die Maschine wandelt es in die “kleinste Einheit” zur Speicherung um. Zum Beispiel:

  • 100,50 USD → Gespeichert als 10050 (Cents)
  • 100 TWD → Gespeichert als 100 (Dollars)

Warum BIGINT wählen?

Grund Beschreibung
Ultraschnelle Geschwindigkeit Ganzzahlige Addition und Subtraktion sind CPU-Spezialitäten; die Rechenleistung ist in der Regel viel schneller als bei DECIMAL.
Platzeffizienz Feste Zuweisung von 8 Bytes, bestens geeignet für ultragroße Datenbanken.

Der Nachteil ist jedoch eine schlechtere Lesbarkeit. Wenn Sie die Datenbank öffnen und 10050 sehen, müssen Sie es im Kopf (oder in Ihrem Code) automatisch durch 100 teilen.

Der ultimative Showdown: Wie soll man sich entscheiden?

Um zu entscheiden, welche Methode man verwenden sollte, können wir “Abfragehäufigkeit” und “Systemskalierung” berücksichtigen:

Vergleichsdimension DECIMAL BIGINT
Lesbarkeit Hervorragend (Zahlen direkt lesen) Schlechter (erfordert manuelle Konvertierung)
Rechengeschwindigkeit Regulär Extrem schnell
Anwendbare Szenarien ERP, interne Finanzsysteme, allgemeiner E-Commerce Hochfrequenzhandel, ultragroße Microservices, konforme APIs im Stripe-Stil

Pragmatische Empfehlungen

Anwendbares Szenario Empfohlenes Feld
Allgemeiner E-Commerce, interne Berichtssysteme von Unternehmen, bei denen Buchhalter SQL direkt für Audits ausführen müssen DECIMAL(19, 4)
Hochfrequenz-Handelssysteme oder extreme Skalierbarkeitsanforderungen BIGINT

Zusammenfassung

Kurz gesagt, egal für welche Methode Sie sich entscheiden, es ist absolut und dauerhaft verboten, FLOAT zur Speicherung von Geld zu verwenden! Die Wahl des richtigen Feldtyps garantiert, dass Ihr System bei finanziellen Berechnungen absolut stabil bleibt.

All rights reserved,未經允許不得隨意轉載
Erstellt mit Hugo
Theme Stack gestaltet von Jimmy