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)?

Mengomentari pertanyaan (2)
Larutan

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 desimal

Lihat MySQL Numerik Jenis:

jenis Ini digunakan ketika hal ini penting untuk melestarikan tepat presisi, misalnya dengan moneter data.

Komentar (5)

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)

Baca

Komentar (4)

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.

Komentar (8)

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.

Komentar (2)

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.

Komentar (4)

Memang hal ini bergantung pada programmer's preferensi. Saya pribadi menggunakan: numerik(15,4) untuk menyesuaikan diri dengan Prinsip Akuntansi yang Diterima Umum (SAK).

Komentar (2)

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 bitcoin

Jika anda mencoba melakukan hal yang sama dengan decimal, anda perlu desimal(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:

  1. Melakukan perbandingan di atasnya.
  2. Menulis itu kembali ke database.

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.

Komentar (2)

Cobalah menggunakan

Decimal(19,4)

hal ini biasanya bekerja dengan setiap DB juga

Komentar (0)

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).

Komentar (3)

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.

  • Untuk tetap sejajar dengan GAAP itu sudah cukup untuk menyimpan uang di DESIMAL(13,4)
  • MySQL manual berbunyi bahwa ia membutuhkan 4 byte per 9 digit ke toko DECIMAL.
  • DESIMAL(13,4) mewakili 9 digit + 4 fraksi digit (angka desimal) => 4 + 2 byte = 6 byte
  • bandingkan dengan 8 byte yang diperlukan untuk menyimpan BIGINT.
Komentar (0)

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/

Komentar (0)

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

Komentar (0)