Qual è il miglior tipo di dati SQL per i valori di valuta? Sto usando MySQL ma preferirei un tipo indipendente dal database.
Qual è il miglior tipo di dati SQL per i valori di valuta? Sto usando MySQL ma preferirei un tipo indipendente dal database.
Risposte:
Qualcosa di simile di Decimal(19,4)
solito funziona abbastanza bene nella maggior parte dei casi. È possibile regolare la scala e la precisione per adattarsi alle esigenze dei numeri che è necessario memorizzare. Anche in SQL Server, tendo a non usare " money
" perché non è standard.
(19,4)
anziché (19,2)
?
L'unica cosa a cui devi fare attenzione è che se esegui la migrazione da un database a un altro potresti scoprire che DECIMAL (19,4) e DECIMAL (19,4) significano cose diverse
( http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html )
DBASE: 10,5 (10 interi, 5 decimali) MYSQL: 15,5 (15 cifre, 10 numeri interi (15-5), 5 decimali)
È anche importante capire quante cifre decimali potrebbero essere necessarie per i tuoi calcoli.
Ho lavorato su un'applicazione di prezzo delle azioni che ha richiesto il calcolo del prezzo di un milione di azioni. Il prezzo delle azioni quotato doveva essere memorizzato a 7 cifre di precisione.
La risposta di Assaf di
Dipende da quanti soldi hai ...
sembra debole, ma in realtà è pertinente.
Solo oggi abbiamo riscontrato un problema per cui un record non è stato inserito nella nostra tabella delle tariffe, perché una delle colonne (GrossRate) è impostata su Decimale (11,4) e il nostro reparto prodotti ha appena ottenuto un contratto per le camere in un resort fantastico a Bora Bora, che vende per diversi milioni di franchi del Pacifico a notte ... qualcosa che non fu mai anticipato quando lo schema del database fu progettato 10 anni fa.
Per le applicazioni di contabilità è molto comune archiviare i valori come numeri interi (alcuni addirittura spingono fino a dire che è l' unico modo). Per avere un'idea, prendi la quantità delle transazioni (supponiamo che $ 100,23) e multipli per 100, 1000, 10000, ecc. Per ottenere l'accuratezza di cui hai bisogno. Quindi, se hai solo bisogno di archiviare centesimi e puoi arrotondare in modo sicuro su o giù, moltiplica per 100. Nel mio esempio, renderebbe 10023 come numero intero da memorizzare. Risparmierai spazio nel database e il confronto di due numeri interi è molto più semplice rispetto al confronto di due float. I miei $ 0,02.
DECIMAL
? Dovresti stare molto attento a tradurre sempre dollari, mulini o mulini in dollari, nei momenti appropriati.
ingresso super late ma GAAP è una buona regola empirica ..
Se l'applicazione deve gestire valori monetari fino a un trilione, questo dovrebbe funzionare: 13,2 Se è necessario rispettare i principi contabili generalmente accettati, utilizzare: 13,4
Di solito dovresti sommare i valori del tuo denaro a 13,4 prima di arrotondare l'output a 13,2.
Fonte: miglior tipo di dati per memorizzare il valore monetario in MySQL
Potresti usare qualcosa di simile DECIMAL(19,2)
per impostazione predefinita per tutti i tuoi valori monetari, ma se memorizzerai sempre valori inferiori a $ 1.000, questo sarà solo uno spreco di prezioso spazio nel database.
Per la maggior parte delle implementazioni, DECIMAL(N,2)
sarebbe sufficiente, in cui il valore di N
è almeno il numero di cifre prima .
della somma più elevata che ci si aspetta di essere memorizzato in quel campo + 5
. Quindi, se non ti aspetti di memorizzare valori superiori a 999999.99, DECIMAL(11,2)
dovrebbe essere più che sufficiente (fino a quando le aspettative non cambieranno).
Se vuoi essere conformi a GAAP , è possibile procedere conDECIMAL(N,4)
un valore pariN
almeno al numero di cifre prima.
della somma massima che si prevede di memorizzare in quel campo+ 7
.
Dipende dalla natura dei dati. Devi contemplarlo in anticipo.
Sebbene MySQL ti permetta di usare il decimale (65,30), 31 per la scala e 30 per la precisione sembrano essere i nostri limiti se vogliamo lasciare aperta l'opzione di trasferimento.
Massima scala e precisione nei RDBMS più comuni:
Bilancia di precisione Oracle 31 31 T-SQL 38 38 MySQL 65 30 PostgreSQL 131072 16383
Settembre 2015 Il governo dello Zimbabwe ha dichiarato che cambierà dollari dello Zimbabwe con dollari statunitensi ad un tasso compreso tra 1 USD e 35 quadrilioni di dollari dello Zimbabwe 5
Tendiamo a dire "sì, certo ... non avrò bisogno di quelle figure pazze". Bene, anche lo Zimbabwe diceva questo. Non molto tempo fa.
Immaginiamo che sia necessario registrare una transazione di 1 mln di dollari in dollari dello Zimbabwe (forse oggi improbabile, ma chissà come sarà tra 10 anni?).
- (1 mln USD) * (35 Quadrylion ZWL) = (10 ^ 6) * (35 * 10 ^ 15) = 35 * 10 ^ 21
- abbiamo bisogno:
- 2 cifre per memorizzare "35"
- 21 cifre per memorizzare gli zeri
- 4 cifre a destra del punto decimale
- questo rende decimale (27,4) che ci costa 15 byte per ogni voce
- possiamo aggiungere un'altra cifra a sinistra senza spese - abbiamo un decimale (28,4) per 15 byte
- Ora possiamo archiviare transazioni da 10 mln di dollari espressi in dollari dello Zimbabwe, o garantirci da un altro sciopero dell'inflazione, che si spera non accada