Was ist der beste SQL-Datentyp für Währungswerte? Ich verwende MySQL, würde aber einen datenbankunabhängigen Typ bevorzugen.
Was ist der beste SQL-Datentyp für Währungswerte? Ich verwende MySQL, würde aber einen datenbankunabhängigen Typ bevorzugen.
Antworten:
So etwas Decimal(19,4)
funktioniert normalerweise in den meisten Fällen ziemlich gut. Sie können den Maßstab und die Präzision an die Anforderungen der zu speichernden Zahlen anpassen. Selbst in SQL Server verwende ich normalerweise nicht " money
", da dies nicht dem Standard entspricht.
(19,4)
anstelle von (19,2)
?
Das einzige, worauf Sie achten müssen, ist, dass DECIMAL (19,4) und DECIMAL (19,4) unterschiedliche Bedeutungen haben, wenn Sie von einer Datenbank in eine andere migrieren
( http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html )
DBASE: 10,5 (10 Ganzzahlen, 5 Dezimalstellen) MYSQL: 15,5 (15 Stellen, 10 Ganzzahlen (15-5), 5 Dezimalstellen)
Es ist auch wichtig herauszufinden, wie viele Dezimalstellen möglicherweise für Ihre Berechnungen erforderlich sind.
Ich habe an einem Aktienkursantrag gearbeitet, bei dem der Preis von einer Million Aktien berechnet werden musste. Der notierte Aktienkurs musste mit einer Genauigkeit von 7 Stellen gespeichert werden.
Assafs Antwort von
Kommt darauf an, wie viel Geld du hast ...
klingt flippig, ist aber eigentlich relevant.
Erst heute hatten wir ein Problem, bei dem ein Datensatz nicht in unsere Rate-Tabelle eingefügt werden konnte, weil eine der Spalten (Bruttorate) auf Dezimal (11,4) gesetzt ist und unsere Produktabteilung gerade einen Vertrag für Zimmer in einem erstaunlichen Resort erhalten hat in Bora Bora, die für mehrere Millionen pazifische Franken pro Nacht verkauft werden ... etwas, das bei der Entwicklung des Datenbankschemas vor 10 Jahren nie erwartet wurde.
Bei Buchhaltungsanwendungen werden die Werte häufig als Ganzzahlen gespeichert (einige sagen sogar, dass dies der einzige Weg ist). Um sich ein Bild zu machen, nehmen Sie den Betrag der Transaktionen (nehmen wir 100,23 USD an) und multiplizieren Sie ihn mit 100, 1000, 10000 usw., um die erforderliche Genauigkeit zu erhalten. Wenn Sie also nur Cent speichern müssen und sicher auf- oder abrunden können, multiplizieren Sie einfach mit 100. In meinem Beispiel würde dies 10023 als zu speichernde Ganzzahl ergeben. Sie sparen Platz in der Datenbank und das Vergleichen von zwei Ganzzahlen ist viel einfacher als das Vergleichen von zwei Floats. Meine $ 0,02.
DECIMAL
? Sie müssen sehr vorsichtig sein, wenn Sie Pennys, Mühlen oder Millrays immer zu den richtigen Zeiten in Dollar umrechnen.
Super später Einstieg, aber GAAP ist eine gute Faustregel.
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: Bester Datentyp zum Speichern des Geldwerts in MySQL
Sie könnten so etwas wie DECIMAL(19,2)
Standard für alle Ihre Geldwerte verwenden, aber wenn Sie immer nur Werte unter 1.000 US-Dollar speichern, wird dies nur eine Verschwendung von wertvollem Datenbankspeicher sein.
Für die meisten Implementierungen DECIMAL(N,2)
wäre dies ausreichend, wenn der Wert von N
mindestens die Anzahl der Stellen vor .
der größten Summe ist, die Sie jemals in diesem Feld gespeichert haben + 5
. Wenn Sie also nie erwarten, Werte über 999999,99 zu speichern, DECIMAL(11,2)
sollte dies mehr als ausreichend sein (bis sich die Erwartungen ändern).
Wenn Sie GAAP- konform sein möchten, können Sie wählenDECIMAL(N,4)
, wobei der Wert von N
mindestens die Anzahl der Stellen vor .
der größten Summe ist, die Sie jemals in diesem Feld gespeichert haben + 7
.
Dies hängt von der Art der Daten ab. Sie müssen es vorher betrachten.
Obwohl Sie in MySQL Dezimalstellen (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:
Präzisionswaage Oracle 31 31 T-SQL 38 38 MySQL 65 30 PostgreSQL 131072 16383
September 2015 Die simbabwische Regierung gab bekannt, dass sie simbabwische Dollar in US-Dollar mit einem Kurs von 1 USD bis 35 Billiarden simbabwischen Dollar 5 umtauschen werde
Wir neigen dazu zu sagen "Ja, sicher ... ich werde diese verrückten Figuren nicht brauchen". Nun, Simbabwer sagten das auch. Vor nicht allzu langer Zeit.
Stellen Sie sich vor, Sie müssen eine Transaktion von 1 Mio. USD in simbabwischen Dollar erfassen (heute vielleicht unwahrscheinlich, aber wer weiß, wie dies in 10 Jahren aussehen wird?).
- (1 Mio. USD) * (35 Quadrylion ZWL) = (10 ^ 6) * (35 * 10 ^ 15) = 35 * 10 ^ 21
- wir brauchen:
- 2 Ziffern zum Speichern von "35"
- 21 Ziffern zum Speichern der Nullen
- 4 Stellen rechts vom Dezimalpunkt
- Dies ergibt eine Dezimalzahl (27,4), die uns 15 Bytes für jeden Eintrag kostet
- Wir können ohne Kosten eine weitere Ziffer links hinzufügen - wir haben eine Dezimalstelle (28,4) für 15 Bytes
- Jetzt können wir 10 Mio. USD-Transaktionen in simbabwischen Dollar speichern oder uns vor einem weiteren Hiperinflations-Streik schützen, der hoffentlich nicht stattfinden wird