Saya ingin menyimpan banyak catatan dalam database MySQL. Semuanya mengandung nilai uang. Tapi saya tidak tahu berapa banyak digit yang akan dimasukkan untuk masing-masing.
Jenis data apa yang harus saya gunakan untuk tujuan ini?
VARCHAR atau INT (atau tipe data numerik lainnya)?
mysql
sqldatatypes
currency
Mohammad Saberi
sumber
sumber
deimal(10,2)
adalah apa yang saya gunakan ... Anda dapat menyesuaikan nilai tergantung pada ukuran yang diharapkanJawaban:
Karena uang memerlukan representasi yang tepat, jangan gunakan tipe data yang hanya perkiraan saja
float
. Anda dapat menggunakan tipe data angka titik tetap untuk yang seperti itu15
adalah presisi (total panjang nilai termasuk tempat desimal)2
adalah jumlah digit setelah titik desimalLihat Jenis Numerik MySQL :
sumber
decimal
dannumeric
sama.numeric(19,4)
untuk catatan keuangan yang memberi Anda tangan yang lebih baik untuk bermain dan mengadopsi permintaan baru dengan mudah.Anda bisa menggunakan
DECIMAL
atauNUMERIC
keduanya samayaitu
DECIMAL(10,2)
Baca bagus
sumber
Saya lebih suka menggunakan
BIGINT
, dan menyimpan nilai-nilai dengan mengalikan dengan 100 , sehingga akan menjadi bilangan bulat.Untuk misalnya, untuk mewakili nilai mata uang
93.49
, nilai tersebut akan disimpan sebagai9349
, sambil menampilkan nilai yang dapat kita bagi dengan 100 dan ditampilkan. Ini akan menempati lebih sedikit ruang penyimpanan.sumber
DECIMAL
? Anda perlu menerjemahkan uang menjadi dolar, dan celakalah jika Anda melupakannya di beberapa titik.$0.005
atau$0.12345
) karena mereka tidak akan berkurang menjadi bilangan bulat setelah dikalikan dengan 100. Jika Anda tahu ketepatan nilai-nilai itu jelas Pilihan terbaik adalah menggunakanDECIMAL
. Tetapi jika Anda tidak tahu ketepatan (seperti dalam contoh saya) maka ... akankahFLOAT
sesuai?Tergantung kebutuhan Anda.
Menggunakan
DECIMAL(10,2)
biasanya sudah cukup tetapi jika Anda membutuhkan nilai yang lebih tepat Anda dapat mengaturDECIMAL(10,4)
.Jika Anda bekerja dengan nilai besar gantikan
10
dengan19
.sumber
Jika aplikasi Anda perlu menangani nilai uang hingga satu triliun maka ini harus bekerja: 13,2 Jika Anda harus mematuhi GAAP (Prinsip Akuntansi yang Diterima Secara Umum) maka gunakan: 13,4
Biasanya Anda harus menjumlahkan nilai uang Anda pada 13,4 sebelum pembulatan output menjadi 13,2.
sumber
Memang ini bergantung pada preferensi programmer. Saya pribadi menggunakan:
numeric(15,4)
untuk mematuhi Prinsip Akuntansi yang Diterima Secara Umum ( GAAP ) .sumber
Coba gunakan
ini biasanya bekerja dengan setiap DB lainnya juga
sumber
Kami menggunakan
double
.* terkesiap *
Mengapa?
Karena itu dapat mewakili angka 15 digit tanpa kendala di mana titik desimal berada . Semua untuk 8 byte sangat sedikit!
Jadi itu bisa mewakili:
0.123456789012345
123456789012345.0
... dan apa pun di antaranya.
Ini berguna karena kita sedang berhadapan dengan mata uang global , dan
double
dapat menyimpan berbagai jumlah tempat desimal yang kemungkinan akan kita temui.Satu
double
bidang tunggal dapat mewakili 999.999.999.999.999dalam yen Jepang, 9.999.999.999.999,999dalam dolar AS dan bahkan 9999.999.999.99999999dalam bitcoinJika Anda mencoba melakukan hal yang sama dengan
decimal
, Anda perludecimal(30, 15)
biaya 14 byte.Peringatan
Tentu saja menggunakan
double
bukan tanpa peringatan.Namun, ini bukan kehilangan keakuratan karena beberapa cenderung menunjukkan. Meskipun
double
itu sendiri mungkin tidak tepat secara internal ke sistem basis 10 , kita dapat membuatnya tepat dengan membulatkan nilainya kita tarik dari basis data ke tempat desimalnya yang signifikan. Jika perlu itu. (mis. Jika itu akan dikeluarkan, dan representasi basis 10 diperlukan.)Peringatannya adalah, setiap kali kita melakukan aritmatika dengannya, kita perlu menormalkan hasilnya (dengan membulatkannya ke tempat desimal yang signifikan) sebelum:
Peringatan jenis lain adalah, tidak seperti di
decimal(m, d)
mana basis data akan mencegah program memasukkan angka dengan lebih darim
digit, tidak ada validasi seperti itudouble
. Suatu program dapat memasukkan nilai yang dimasukkan pengguna sebesar 20 digit dan akhirnya akan dicatat secara diam-diam sebagai jumlah yang tidak akurat.sumber
1.410000000000
(dua belas tempat desimal yang signifikan), tetapi mengalikannya dengan 1.000.000.000.000 (yang merupakan 13 digit signifikan dari titik desimal) berarti kita bekerja dengan di Setidaknya gabungan 25 digit. Sejauh ini jauh melampaui 15 tersedia untuk ganda, jadi desain-bijaksana saya pikir itu akan sangat rusak.Pada saat pertanyaan ini ditanyakan, tidak ada yang memikirkan harga Bitcoin. Dalam kasus BTC, mungkin tidak cukup untuk digunakan
DECIMAL(15,2)
. Jika Bitcoin akan naik menjadi $ 100.000 atau lebih, kita akan memerlukan setidaknyaDECIMAL(18,9)
untuk mendukung cryptocurrency di aplikasi kita.DECIMAL(18,9)
membutuhkan 12 byte ruang di MySQL ( 4 byte per 9 digit ).sumber
Menyimpan uang
BIGINT
dikalikan 100 atau lebih dengan alasan untuk menggunakan ruang penyimpanan lebih sedikit tidak masuk akal dalam semua situasi "normal".DECIMAL(13,4)
DECIMAL
.DECIMAL(13,4)
mewakili 9 digit + 4 digit fraksi (tempat desimal) => 4 + 2 byte = 6 byteBIGINT
.sumber
Jika Kepatuhan GAAP diperlukan atau Anda membutuhkan 4 tempat desimal:
DECIMAL (13, 4) Yang mendukung nilai maksimal:
$ 999.999.999.9999
Jika tidak, jika 2 tempat desimal sudah cukup: DECIMAL (13,2)
src: https://rietta.com/blog/best-data-types-for-currencymoney-in/
sumber
Kalikan 10.000 dan simpan sebagai BIGINT, seperti "Mata Uang" di Visual Basic dan Office. Lihat https://msdn.microsoft.com/en-us/library/office/gg264338.aspx
sumber