Jaki jest najlepszy typ danych SQL dla wartości walutowych? Używam MySQL, ale wolałbym typ niezależny od bazy danych.
Jaki jest najlepszy typ danych SQL dla wartości walutowych? Używam MySQL, ale wolałbym typ niezależny od bazy danych.
Odpowiedzi:
Coś takiego Decimal(19,4)
zwykle działa całkiem dobrze w większości przypadków. Możesz dostosować skalę i precyzję do potrzeb liczb, które chcesz przechowywać. Nawet w SQL Server nie używam „ money
”, ponieważ jest niestandardowy.
(19,4)
zamiast (19,2)
?
Jedyną rzeczą, na którą musisz uważać, to migracja z jednej bazy danych do innej może okazać się, że DECIMAL (19,4) i DECIMAL (19,4) oznaczają różne rzeczy
( http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html )
DBASE: 10,5 (10 liczb całkowitych, 5 miejsc po przecinku) MYSQL: 15,5 (15 cyfr, 10 liczb całkowitych (15-5), 5 miejsc po przecinku)
Ważne jest również ustalenie, ile miejsc dziesiętnych może być wymaganych do obliczeń.
Pracowałem nad aplikacją cen akcji, która wymagała obliczenia ceny miliona akcji. Podana cena akcji musiała być zapisana z dokładnością do 7 cyfr.
Odpowiedź Assafa na
Zależy, ile masz pieniędzy ...
brzmi to głupio, ale tak naprawdę to jest trafne.
Dopiero dzisiaj mieliśmy problem polegający na tym, że nie udało się wstawić rekordu do naszej tabeli stawek, ponieważ jedna z kolumn (GrossRate) ma wartość dziesiętną (11,4), a nasz dział produktów właśnie dostał kontrakt na pokoje w jakimś niesamowitym kurorcie w Bora Bora, które sprzedają za kilka milionów franków pacyficznych za noc ... coś, czego nigdy nie oczekiwano, kiedy schemat bazy danych został zaprojektowany 10 lat temu.
W przypadku aplikacji księgowych bardzo często przechowywane są wartości jako liczby całkowite (niektóre nawet posunęły się do stwierdzenia, że to jedyny sposób). Aby uzyskać pomysł, weź kwotę transakcji (załóżmy 100,23 USD) i pomnóż przez 100, 1000, 10000 itd., Aby uzyskać wymaganą dokładność. Więc jeśli potrzebujesz tylko przechowywać centy i możesz bezpiecznie zaokrąglić w górę lub w dół, po prostu pomnóż przez 100. W moim przykładzie dałoby to 10023 jako liczbę całkowitą do przechowywania. Zaoszczędzisz miejsce w bazie danych, a porównywanie dwóch liczb całkowitych jest znacznie łatwiejsze niż porównywanie dwóch liczb zmiennoprzecinkowych. Moje 0,02 $.
DECIMAL
? Trzeba bardzo uważać, aby zawsze w odpowiednim czasie tłumaczyć grosz, młyny lub młyny na dolary.
bardzo późne wejście, ale GAAP to dobra zasada.
Jeśli Twoja aplikacja musi obsługiwać wartości pieniężne do biliona, powinno to działać: 13,2 Jeśli musisz przestrzegać GAAP (ogólnie przyjętych zasad rachunkowości), użyj: 13,4
Zwykle powinieneś sumować swoje wartości pieniężne na 13,4 przed zaokrągleniem wyniku do 13,2.
Źródło: Najlepszy typ danych do przechowywania wartości pieniężnej w MySQL
Możesz użyć czegoś takiego jak DECIMAL(19,2)
domyślnie dla wszystkich swoich wartości pieniężnych, ale jeśli kiedykolwiek będziesz przechowywać wartości niższe niż 1000 USD, będzie to po prostu marnowanie cennej przestrzeni w bazie danych.
W przypadku większości implementacji DECIMAL(N,2)
wystarczy, gdy wartość N
jest co najmniej liczbą cyfr przed .
największą sumą, jakiej można się spodziewać w tym polu + 5
. Jeśli więc nie spodziewasz się przechowywać wartości większych niż 999999.99, DECIMAL(11,2)
powinno być więcej niż wystarczające (dopóki nie zmienią się oczekiwania).
Jeśli chcesz być zgodny z GAAP , możesz przejść DECIMAL(N,4)
, gdzie wartość N
to co najmniej liczba cyfr przed .
największą sumą, jakiej kiedykolwiek spodziewałeś się przechowywać w tym polu + 7
.
To zależy od charakteru danych. Musisz to przemyśleć wcześniej.
Chociaż MySQL pozwala używać dziesiętnych (65, 30), 31 dla skali i 30 dla precyzji wydają się być naszymi ograniczeniami, jeśli chcemy pozostawić opcję transferu otwartą.
Maksymalna skala i precyzja w większości popularnych RDBMS:
Skala precyzji Oracle 31 31 T-SQL 38 38 MySQL 65 30 PostgreSQL 131072 16383
Wrzesień 2015 r. Rząd Zimbabwe oświadczył, że będzie wymieniał dolary Zimbabwe na dolary amerykańskie według stawki od 1 USD do 35 biliardów dolarów Zimbabwe 5
Zwykle mówimy „tak, jasne ... Nie będę potrzebował tych szalonych postaci”. Cóż, Zimbabwe też to mówili. Nie tak dawno temu.
Wyobraźmy sobie, że musisz zarejestrować transakcję 1 mln USD w dolarach Zimbabwe (być może dziś mało prawdopodobne, ale kto wie, jak to będzie wyglądać za 10 lat?).
- (1 mln USD) * (35 Quadrylion ZWL) = (10 ^ 6) * (35 * 10 ^ 15) = 35 * 10 ^ 21
- potrzebujemy:
- 2 cyfry do zapisania „35”
- 21 cyfr do przechowywania zer
- 4 cyfry po prawej stronie przecinka dziesiętnego
- to czyni dziesiętne (27,4), co kosztuje nas 15 bajtów na każdy wpis
- możemy dodać jeszcze jedną cyfrę po lewej bez żadnych kosztów - mamy dziesiętne (28,4) na 15 bajtów
- Teraz możemy przechowywać transakcję o wartości 10 mln USD wyrażoną w dolarach Zimbabwe lub zabezpieczyć się przed kolejnym atakiem hiperinflacji, co, mam nadzieję, nie nastąpi