Bagaimana cara menggunakan MySQL DECIMAL?

177

Saya tidak bisa memahami DECIMAL MySQL. Saya perlu baris untuk dapat memuat angka dari 00.0001 hingga 99.9999. Bagaimana saya menyusunnya agar berfungsi seperti itu?

Charles Zink
sumber
4
Anda harus benar-benar menerima jawaban yang benar. Jawaban yang diterima saat ini salah.
Olhovsky
2
Berakhir di sini dan baca jawaban yang mengklaim bahwa DECIMAL UNSIGNED tidak memungkinkan. Lihat jawaban segar di bawah untuk spesifikasi yang benar untuk ini.
Markus AO

Jawaban:

439

Kolom DOUBLE tidak sama dengan kolom DECIMAL, dan Anda akan mendapat masalah jika Anda menggunakan kolom DOUBLE untuk data keuangan.

DOUBLE sebenarnya hanya versi FLOAT versi double precision (64 bit bukannya 32 bit) . Angka floating point adalah perkiraan perkiraan dari bilangan real dan tidak tepat. Bahkan, angka sederhana seperti 0,01 tidak memiliki representasi yang tepat dalam tipe FLOAT atau DOUBLE.

Kolom DECIMAL adalah representasi yang tepat, tetapi membutuhkan lebih banyak ruang untuk rentang angka yang jauh lebih kecil. Untuk membuat kolom yang mampu menyimpan nilai dari 0,0001 hingga 99,9999 seperti yang Anda minta, Anda perlu pernyataan berikut

CREATE TABLE your_table
(
    your_column DECIMAL(6,4) NOT NULL
);

Definisi kolom mengikuti format DECIMAL (M, D) di mana M adalah jumlah maksimum digit ( presisi ) dan D adalah jumlah digit di sebelah kanan titik desimal ( skala ).

Ini berarti bahwa perintah sebelumnya membuat kolom yang menerima nilai dari -99.9999 hingga 99.9999. Anda juga dapat membuat kolom DECIMAL TIDAK TANDA, mulai dari 0,0000 hingga 99,9999.

Untuk informasi lebih lanjut tentang MySQL DECIMAL, dokumen resmi selalu menjadi sumber yang bagus.

Ingatlah bahwa semua informasi ini berlaku untuk versi MySQL 5.0.3 dan lebih tinggi. Jika Anda menggunakan versi sebelumnya, Anda benar-benar harus meningkatkan.

Alex Recarey
sumber
17
Memilih jawaban Anda. Jawaban Anda benar, jawaban lainnya tidak (karena mengklaim bahwa "double = desimal"). DECIMAL adalah tipe titik tetap dengan nilai tepat dan sinonimnya adalah NUMERIC, DEC, dan FIXED. Bukan GANDA, karena GANDA adalah tipe titik-mengambang yang mewakili perkiraan nilai data numerik. Saat menggunakan DECIMAL (<1-65>, <0-30>), parameter pertama adalah jumlah digit, yang kedua jumlah digit di sebelah kanan titik desimal.
Norbert
2
Ya kamu benar. Perhatikan bahwa berfungsi untuk MySQL 5.0.3 dan seterusnya, dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html
ajreal
1
Poster meminta bidang desimal yang memiliki nilai antara 0,0001 dan 99,9999. Saya menambahkan beberapa informasi tambahan untuk memperjelas bahwa bidang yang dibuat sebenarnya mendukung nilai dari -99.9999 hingga 99.9999. Terima kasih untuk umpan baliknya! Juga ditambahkan penafian versi MySQL.
Alex Recarey
1
Anda berkata "Tidak ada cara untuk membuat" kolom DECIMAL "unsigned", namun contoh kode Anda menunjukkan "DECIMAL (6,4) TANDA TANGAN NULL". Kenapa ini?
liang
3
@AlexRecarey Sepertinya saya bisa membuat DECIMAL TANPA TANDA saja; dan manual untuk MySQL 5.x setuju: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Ini akan mengembalikan kesalahan di luar kisaran untuk nilai negatif. Anda juga dapat membuat FLOAT dan DOUBLE yang tidak ditandatangani. Manual: dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
Markus AO
67

Meskipun jawaban di atas tampaknya benar, hanya penjelasan sederhana untuk memberi Anda gambaran tentang cara kerjanya.

Misalkan kolom Anda diatur menjadi DECIMAL(13,4). Ini berarti bahwa kolom akan memiliki ukuran total 13 digit di mana 4 di antaranya akan digunakan untuk representasi presisi.

Jadi, dalam ringkasan, untuk kolom itu Anda akan memiliki nilai maksimum: 999999999.9999

Cristiano
sumber
1
jawaban terbaik di sini
Julian Silvestri
15

Ada solusi yang benar dalam komentar, tetapi untuk meringkasnya menjadi satu jawaban:

Anda harus menggunakan DECIMAL (6,4).

Kemudian Anda dapat memiliki 6 jumlah digit, 2 sebelum dan 4 setelah titik desimal (skala). Setidaknya sesuai dengan ini .

Zoltán Hajdú
sumber
6

MySQL 5.x spesifikasi untuk datatype desimal adalah: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Jawaban di atas salah dalam mengatakan bahwa desimal tak bertanda tidak mungkin.

Untuk menentukan bidang yang memungkinkan hanya desimal ditandatangani, dengan panjang total 6 digit, 4 di antaranya adalah desimal, Anda akan menggunakan: DECIMAL (6,4) UNSIGNED.

Anda juga dapat membuat tipe data FLOAT dan DOUBLE yang tidak ditandatangani (mis. Tidak negatif).

Markus AO
sumber