Cel mai bun tip de date pentru a stoca valori de bani în MySQL

Vreau să stocați mai multe înregistrări într-o bază de date MySQL. Toate le conține valorile bani. Dar eu nu't știu cât de multe cifre va fi introdus pentru fiecare. Care tip de date trebuie să utilizeze în acest scop? VARCHAR sau INT (sau alte tipuri de date numerice)?

Comentarii la întrebare (2)
Soluția

De bani are nevoie de o reprezentare exactă don't folosi tipurile de date care sunt doar aproximative ca "float". Puteți utiliza un punct fix tip de date numeric pentru ca

decimal(15,2)
  • 15 este de precizie (lungime totală de valoare, inclusiv zecimale)
  • 2 este numărul de cifre după punctul zecimal

A Se Vedea MySQL Tipuri Numerice:

Aceste tipuri sunt utilizate atunci când este important să se păstreze exact precizie, de exemplu cu monetar date.

Comentarii (5)

Puteți folosi ZECIMALE " sau " NUMERIC` ambele sunt la fel

ZECIMAL și tipuri NUMERICE magazin exact datele numerice de valori. Aceste tipuri sunt utilizate atunci când este important să se păstreze exact precizie, de exemplu cu datele monetare. În MySQL, NUMERIC este implementat ca ZECIMAL, astfel încât următoarele remarci despre ZECIMAL se aplică în mod egal NUMERIC. : MySQL

adică ZECIMAL(10,2)

Citit bine

Comentarii (4)

Eu prefer să folosesc BIGINT`, și stoca valorile în de se înmulțește cu 100, astfel încât acesta va deveni întreg.

De exemplu, pentru a reprezenta o monedă valoare de 93.49, valoarea trebuie să fie stocate ca9349`, în timp ce afișează valoarea putem divide cu 100 și de afișare. Aceasta va ocupa mai puțin spațiu de stocare.

Atenție: Cea mai mare parte nu ne't de a efectua în valută * moneda` de multiplicare, în cazul în care o facem apoi împărțiți rezultatul cu 100 și magazin, astfel că se revine la buna precizie.

Comentarii (8)

Depinde de nevoia ta.

Folosind ZECIMAL(10,2) este de obicei suficient, dar dacă ai nevoie de un pic mai precis valorile puteți seta ZECIMAL(10,4).

Dacă lucrați cu valori mari înlocui 10 cu 19.

Comentarii (2)

Dacă cererea dumneavoastră are nevoie să se ocupe de bani, valori de până la un trilion de atunci acest lucru ar trebui să funcționeze: 13,2 Dacă aveți nevoie pentru a se conforma cu GAAP (Principiile Contabile General Acceptate) apoi utilizați: 13,4

De obicei, ar trebui să-suma ta de bani, valori la 13,4 înainte de rotunjire de ieșire la 13,2.

Comentarii (4)

Într-adevăr, acest lucru se bazează pe programator's preferințe. Eu personal folosesc: `numeric(15,4) să se conformeze Principiile Contabile General Acceptate (GAAP).

Comentarii (2)

Vom folosi "dublu".

gasp

De ce?

Pentru că acesta poate reprezenta orice 15 cifre fără constrângeri pe unde punctul zecimal este. Toate pentru o amărâtă de 8 bytes!

Deci, se poate reprezenta:

  • 0.123456789012345
  • 123456789012345.0

...și nimic în între.

Acest lucru este util pentru că ne-am're de-a face cu monede la nivel mondial, și "dublu" poate stoca numere diferite de zecimale ne'll întâlni probabil.

Un singur "dublu" domeniu poate reprezenta 999,999,999,999,999 s în yeni Japonezi, 9,999,999,999,999.99 în dolari SUA și chiar 9,999,999.99999999 s în bitcoins

Dacă încerci să faci la fel cu zecimale, ai nevoie de zecimale(30, 15)` care costă 14 bytes.

Avertismente

Desigur, folosind "dublu" e't fără limitări.

Cu toate acestea, - l's nu pierderea de precizie ca unii tind să subliniez. Chiar dacă "dublu" în sine nu poate fi pe plan intern exact în baza 10 sistem, putem face exact de rotunjire la valoarea ne-am trage din baza de date a acestuia semnificative zecimale. Dacă este necesar, care este. (de exemplu, Dacă se's va fi scoasă, și în baza 10 de reprezentare este necesar.)

Avertismentele sunt, în orice moment vom efectua aritmetică cu ea, avem nevoie pentru a normaliza rezultatul (prin rotunjire sale semnificative zecimale) înainte:

  1. Efectuarea de comparații pe ea.
  2. Scris înapoi la baza de date.

Un alt tip de problemă este, spre deosebire de `zecimal(m, d) în cazul în care baza de date va împiedica programe de introducerea unui număr cu mai mult de " m "cifre, nu există un astfel de validări există cu "dublu". Un program ar putea introduce un utilizator introduse în valoare de 20 de cifre și it'll end up fiind înregistrate în tăcere ca un inexacte sumă.

Comentarii (2)

Încercați să utilizați

Decimal(19,4)

acest lucru, de obicei, funcționează cu orice alte DB precum

Comentarii (0)

În timp, această întrebare a fost întrebat nimeni nu a crezut despre Bitcoin preț. În caz de BTC, este probabil insuficient pentru a utiliza ZECIMAL(15,2). Daca Bitcoin va crește la $100,000 sau mai mult, vom avea nevoie de cel puțin ZECIMAL(18,9) pentru a sprijini cryptocurrencies în aplicații noastre.

ZECIMAL(18,9) ia 12 octeți în MySQL ([4 bytes pe 9 cifre][1]).
Comentarii (3)

Stocarea bani ca BIGINT înmulțit cu 100 sau mai mult, cu motivul de a utiliza mai puțin spațiu de stocare nu are nici un sens în toate "normale" situații.

  • Să stau aliniate cu GAAP este suficient pentru a stoca monede în ZECIMAL(13,4)`
  • MySQL manual spune că este nevoie de 4 bytes pe 9 cifre pentru a stoca ZECIMAL.
  • ZECIMAL(13,4) reprezintă 9 cifre + 4 fracțiune cifre (zecimale) => 4 + 2 bytes = 6 bytes
  • compara la 8 octeți necesar pentru a stoca BIGINT.
Comentarii (0)

Dacă GAAP Conformitate este necesară sau ai nevoie de 4 zecimale:

ZECIMAL(13, 4) Care acceptă un maxim de valoare de:

$999,999,999.9999

În caz contrar, în cazul în care 2 zecimale este suficient: ZECIMAL(13,2)

src: https://rietta.com/blog/best-data-types-for-currencymoney-in/

Comentarii (0)

Multiplică 10000 și magazine ca BIGINT, cum ar fi "Moneda" în Visual Basic și Birou. Vezi https://msdn.microsoft.com/en-us/library/office/gg264338.aspx

Comentarii (0)