Chcę przechowywać wiele rekordów w bazie danych MySQL. Wszystkie zawierają wartości pieniężne. Ale nie wiem, ile cyfr zostanie wstawionych dla każdego.
Jakiego typu danych muszę użyć w tym celu?
VARCHAR lub INT (lub inne typy danych numerycznych)?
mysql
sqldatatypes
currency
Mohammad Saberi
źródło
źródło
deimal(10,2)
to jest to, czego używam ... możesz dostosować wartości w zależności od oczekiwanego rozmiaruOdpowiedzi:
Ponieważ pieniądze wymagają dokładnej reprezentacji, nie używaj typów danych, które są jedynie przybliżone
float
. Możesz użyć do tego typu liczbowego typu danych o stałym punkcie15
to precyzja (całkowita długość wartości, w tym miejsca po przecinku)2
to liczba cyfr po przecinkuZobacz typy liczbowe MySQL :
źródło
decimal
inumeric
są takie same.numeric(19,4)
do dokumentacji finansowej, która daje lepszą rękę do grania i łatwego przyjmowania nowych żądań.Możesz użyć
DECIMAL
lubNUMERIC
oba są takie sameto znaczy
DECIMAL(10,2)
Dobra lektura
źródło
Wolę używać
BIGINT
i przechowywać wartości, mnożąc przez 100 , aby stała się liczbą całkowitą.Na przykład, aby przedstawić wartość waluty
93.49
, wartość należy zapisać jako9349
, wyświetlając wartość, którą możemy podzielić przez 100 i wyświetlić. Zajmie to mniej miejsca do przechowywania.źródło
DECIMAL
? Stwarzasz potrzebę przetłumaczenia groszy na dolary i biada, jeśli w pewnym momencie o tym zapomnisz.$0.005
Lub$0.12345
), ponieważ nie zmniejszą się one do liczby całkowitej po pomnożeniu przez 100. Jeśli znasz dokładność wartości, jasne jest, że najlepszą opcją jest użycieDECIMAL
. Ale jeśli nie znasz precyzji (jak w moich przykładach), to… byłobyFLOAT
właściwe?To zależy od twoich potrzeb.
Używanie
DECIMAL(10,2)
zwykle wystarcza, ale jeśli potrzebujesz nieco bardziej precyzyjnych wartości, możesz ustawićDECIMAL(10,4)
.Jeśli pracujesz z dużymi wartościami zastąpić
10
z19
.źródło
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
Rzeczywiście zależy to od preferencji programisty. Ja osobiście używam: w
numeric(15,4)
celu przestrzegania ogólnie przyjętych zasad rachunkowości ( GAAP ) .źródło
Spróbuj użyć
zwykle działa to również z każdym innym DB
źródło
Używamy
double
.*łapanie tchu*
Czemu?
Ponieważ może reprezentować dowolną 15-cyfrową liczbę bez ograniczeń co do miejsca po przecinku . Wszystko za marne 8 bajtów!
Może więc reprezentować:
0.123456789012345
123456789012345.0
... i wszystko pomiędzy.
Jest to przydatne, ponieważ mamy do czynienia z globalnymi walutami i
double
możemy przechowywać różne liczby miejsc dziesiętnych, które prawdopodobnie napotkamy.Pojedyncze
double
pole może reprezentować 999,999,999,999,999 sekund w jenach japońskich, 9999,999,999,999,99 dolarów w dolarach amerykańskich, a nawet 9 999,999.99999999 sekund w bitcoinachJeśli spróbujesz zrobić to samo
decimal
, potrzebujeszdecimal(30, 15)
14 bajtów.Ostrzeżenia
Oczywiście używanie
double
nie jest bez zastrzeżeń.Jednak nie jest to utrata dokładności, jak niektórzy wskazują. Chociaż
double
sam może nie być wewnętrznie dokładny w stosunku do systemu podstawowego 10 , możemy to zrobić, zaokrąglając wartość którą pobieramy z bazy danych do jej znaczących miejsc po przecinku. W razie potrzeby to jest. (np. jeśli ma zostać wydrukowany i wymagana jest podstawowa reprezentacja 10).Zastrzeżenia są następujące: za każdym razem, gdy wykonujemy z nim arytmetykę, musimy znormalizować wynik (zaokrąglając go do jego znaczących miejsc po przecinku) przed:
Innym zastrzeżeniem jest to, że w przeciwieństwie do sytuacji, w
decimal(m, d)
której baza danych uniemożliwia programom wstawianie liczb zawierających więcej niżm
cyfry, nie ma takiej weryfikacjidouble
. Program może wstawić wprowadzoną przez użytkownika wartość 20 cyfr, a następnie zostanie po cichu zapisany jako niedokładna kwota.źródło
1.410000000000
000 000 000 (przecinek jako separator tysięcy), przyjmuje się, że dane wejściowe wynoszą (dwanaście znaczących miejsc po przecinku), ale pomnożenie tego przez 1 000 000 000 000 (czyli 13 cyfr znaczących po przecinku) oznacza, że pracujemy z co najmniej 25 cyfr znaczących łącznie. To znacznie przewyższa 15 dostępnych za podwójną, więc myślę, że pod względem projektowym byłby bardzo zepsuty.W chwili, gdy zadano pytanie, nikt nie myślał o cenie Bitcoin. W przypadku BTC korzystanie z niego jest prawdopodobnie niewystarczające
DECIMAL(15,2)
. Jeśli Bitcoin wzrośnie do 100 000 USD lub więcej, będziemy musieli przynajmniejDECIMAL(18,9)
wspierać kryptowaluty w naszych aplikacjach.DECIMAL(18,9)
zajmuje 12 bajtów miejsca w MySQL ( 4 bajty na 9 cyfr ).źródło
Przechowywanie pieniędzy
BIGINT
pomnożonych przez 100 lub więcej z powodu mniejszej ilości miejsca do przechowywania nie ma sensu we wszystkich „normalnych” sytuacjach.DECIMAL(13,4)
DECIMAL
.DECIMAL(13,4)
reprezentuje 9 cyfr + 4 cyfry ułamkowe (miejsca dziesiętne) => 4 + 2 bajty = 6 bajtówBIGINT
.źródło
Jeśli wymagana jest zgodność z GAAP lub potrzebujesz 4 miejsc po przecinku:
DECIMAL (13, 4), który obsługuje maksymalną wartość:
999,999,999,9999 USD
W przeciwnym razie, jeśli wystarczą 2 miejsca po przecinku: DECIMAL (13,2)
src: https://rietta.com/blog/best-data-types-for-currencymoney-in/
źródło
Mnoży 10000 i przechowuje jako DUŻY, jak „Waluta” w Visual Basic i Office. Zobacz https://msdn.microsoft.com/en-us/library/office/gg264338.aspx
źródło