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)?
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 suka
decimal(15,2)
15
adalah presisi (panjang total nilai termasuk tempat desimal)2
adalah jumlah digit setelah titik desimalLihat MySQL Numerik Jenis:
jenis Ini digunakan ketika hal ini penting untuk melestarikan tepat presisi, misalnya dengan moneter data.
Anda dapat menggunakan DECIMAL
atau NUMERIK
keduanya sama
DECIMAL dan NUMERIC jenis toko yang tepat numerik nilai-nilai data. Jenis ini digunakan ketika hal ini penting untuk melestarikan tepat presisi, misalnya dengan data keuangan. Di MySQL, ANGKA ini dilaksanakan sebagai DESIMAL, jadi berikut ini pernyataan tentang DESIMAL berlaku untuk NUMERIK. : MySQL
yaitu DECIMAL(10,2)
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 sebagai 9349
, sedangkan untuk menampilkan nilai yang dapat kita dibagi dengan 100 dan tampilan. Ini akan menempati sedikit ruang penyimpanan.
hati-Hati: Kebanyakan kita don't melakukan
mata uang * uang
perkalian, dalam kasus jika kami melakukan itu kemudian membagi hasilnya dengan 100 dan toko, sehingga kembali ke tepat presisi.
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 mengatur DESIMAL(10,4)
.
Jika anda bekerja dengan menggantikan nilai-nilai 10
dengan 19
.
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.
double
.terkesiap
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 bitcoin
Jika anda mencoba melakukan hal yang sama dengan decimal
, anda perlu desimal(30, 15)
dengan biaya 14 byte.
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 dari m
digit, tidak ada validasi dengan ganda
. Sebuah program bisa memasukkan pengguna diinput nilai 20 digit dan itu'll berakhir menjadi diam-diam direkam sebagai tidak akurat jumlah.
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 setidaknya DESIMAL(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