Terbaik tipe data untuk menyimpan uang nilai-nilai dalam MySQL
Saya ingin menyimpan berbagai data di database MySQL. Mereka semua berisi uang nilai-nilai. Tapi aku don't tahu berapa banyak digit yang akan dimasukkan untuk setiap satu. Yang tipe data apakah saya harus menggunakan untuk tujuan ini? VARCHAR atau INT (atau lain jenis data numerik)?
259
12
Karena kebutuhan uang representasi yang tepat don't menggunakan tipe data yang hanya kira-kira seperti
mengambang
. Anda dapat menggunakan fixed-point tipe data numerik untuk yang suka15
adalah presisi (panjang total nilai termasuk tempat desimal)2
adalah jumlah digit setelah titik desimalLihat MySQL Numerik Jenis:
Anda dapat menggunakan
DECIMAL
atauNUMERIK
keduanya samayaitu
DECIMAL(10,2)
Baca
Saya lebih memilih untuk menggunakan
BIGINT
, dan menyimpan nilai dalam oleh kalikan dengan 100, sehingga akan menjadi integer.Misalnya, untuk mewakili nilai mata uang dari
93.49
, nilai akan disimpan sebagai9349
, sedangkan untuk menampilkan nilai yang dapat kita dibagi dengan 100 dan tampilan. Ini akan menempati sedikit ruang penyimpanan.Hal ini tergantung pada kebutuhan anda.
Menggunakan
DECIMAL(10,2)
biasanya cukup, tetapi jika anda perlu sedikit lebih banyak nilai-nilai yang tepat anda dapat mengaturDESIMAL(10,4)
.Jika anda bekerja dengan menggantikan nilai-nilai
10
dengan19
.Jika kebutuhan aplikasi anda untuk menangani uang dengan nilai sampai satu triliun maka ini harus bekerja: 13,2 Jika anda perlu untuk mematuhi GAAP (Prinsip Akuntansi yang Diterima Umum) maka penggunaan: 13,4
Biasanya anda harus jumlah uang anda nilai-nilai di 13,4 sebelum pembulatan dari output ke 13,2.
Memang hal ini bergantung pada programmer's preferensi. Saya pribadi menggunakan:
numerik(15,4)
untuk menyesuaikan diri dengan Prinsip Akuntansi yang Diterima Umum (SAK).Kami menggunakan
double
.terkesiap
Mengapa?
Karena itu dapat mewakili setiap 15 digit angka dengan tidak ada kendala pada tempat titik desimal adalah. Semua untuk sedikit 8 byte!
Sehingga dapat mewakili:
0.123456789012345
123456789012345.0
...dan apa pun di antara.
Hal ini berguna karena kita're berurusan dengan mata uang global, dan
double
dapat menyimpan berbagai angka desimal kami'll kemungkinan pertemuan.Single
double
field yang dapat mewakili 999,999,999,999,999 s dalam yen Jepang, 9,999,999,999,999.99 s dalam dolar AS dan bahkan 9,999,999.99999999 s di bitcoinJika anda mencoba melakukan hal yang sama dengan
decimal
, anda perludesimal(30, 15)
dengan biaya 14 byte.Peringatan
Tentu saja, menggunakan
double
isn't tanpa peringatan.Namun, it's tidak kehilangan akurasi karena beberapa cenderung untuk menunjukkan. Meskipun
double
itu sendiri tidak dapat internal yang tepat untuk basis 10 sistem, kita dapat membuat hal yang tepat dengan pembulatan nilai kita tarik dari database yang signifikan desimal. Jika diperlukan itu. (misalnya Jika's akan dikeluarkan, dan basis 10 representasi diperlukan.)Peringatan ini adalah, setiap kali kita melakukan aritmatika dengan itu, kita perlu untuk menormalkan hasilnya (dengan pembulatan ke yang signifikan desimal) sebelum:
Jenis lain dari peringatan ini, tidak seperti
decimal(m, d)
di mana database akan mencegah program dari memasukkan nomor dengan lebih darim
digit, tidak ada validasi denganganda
. Sebuah program bisa memasukkan pengguna diinput nilai 20 digit dan itu'll berakhir menjadi diam-diam direkam sebagai tidak akurat jumlah.Cobalah menggunakan
hal ini biasanya bekerja dengan setiap DB juga
Pada saat pertanyaan ini diajukan tidak ada yang berpikir tentang harga Bitcoin. Dalam kasus BTC, itu mungkin tidak cukup untuk menggunakan
DESIMAL(15,2)
. Jika Bitcoin akan naik ke $100.000 atau lebih, kita akan membutuhkan setidaknyaDESIMAL(18,9)
untuk mendukung mata uang kriptografi dalam aplikasi kita.DESIMAL(18,9)
membutuhkan 12 byte ruang di MySQL (4 byte per 9 digit).Menyimpan uang sebagai
BIGINT
dikalikan dengan 100 atau lebih dengan alasan untuk menggunakan lebih sedikit ruang penyimpanan yang tidak masuk akal dalam semua "normal" situasi.DESIMAL(13,4)
DECIMAL
.DESIMAL(13,4)
mewakili 9 digit + 4 fraksi digit (angka desimal) => 4 + 2 byte = 6 byteBIGINT
.Jika GAAP Kepatuhan diperlukan atau anda membutuhkan 4 tempat desimal:
DESIMAL(13, 4) Yang mendukung nilai max dari:
$999,999,999.9999
Sebaliknya, jika 2 tempat desimal adalah cukup: DESIMAL(13,2)
src: https://rietta.com/blog/best-data-types-for-currencymoney-in/
Mengalikan 10000 dan toko-toko sebagai BIGINT, seperti "Uang" dalam Visual Basic dan Kantor. Lihat https://msdn.microsoft.com/en-us/library/office/gg264338.aspx