Jaki jest najlepszy typ danych SQL dla wartości walutowych? Używam MySQL, ale wolałbym typ niezależny od bazy danych.
mysql
sql
sqldatatypes
Brian Fisher
źródło
źródło
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.źródło
(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 )
źródło
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.
źródło
Odpowiedź Assafa na
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.
źródło
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 $.
źródło
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.
Źródło: Najlepszy typ danych do przechowywania wartości pieniężnej w MySQL
źródło
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
.źródło
To zależy od charakteru danych. Musisz to przemyśleć wcześniej.
Mój przypadek
Dlaczego (M, 4)?
Kompromis
Kompatybilny Extreme
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:
6 , 7 , 8 , 9
Rozsądny Extreme
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?).
źródło
Chociaż może to być późno, ale będzie pomocne dla kogoś innego. Z mojego doświadczenia i badań poznałem i akceptuję dziesiętne (19, 6). Tak jest podczas pracy z php i mysql. podczas pracy z dużą ilością pieniędzy i kursem wymiany
źródło