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 pariNalmeno 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