MySQL DECIMAL nasıl kullanılır?


177

MySQL'in DECIMAL'ini tam olarak kavrayamıyorum. 00.0001 ile 99.9999 arasında herhangi bir sayı içerebilmek için satıra ihtiyacım var. Böyle çalışmasını nasıl yapılandırabilirim?



4
Doğru cevabı gerçekten kabul etmelisin. Şu anda kabul edilen cevap yanlış.
Olhovsky

2
Burada sona erdi ve DECIMAL UNSIGNED'in mümkün olmadığını iddia eden yanıtı okuyun. Bunun için doğru spesifikasyon için aşağıdaki yeni cevaba bakınız.
Markus AO

Yanıtlar:


439

DOUBLE sütunları DECIMAL sütunlarıyla aynı değildir ve finansal veriler için DOUBLE sütunlarını kullanırsanız sorun yaşarsınız.

ÇİFT aslında sadece bir çift duyarlıklı (64 bit yerine 32 bit) sürümüdür FLOAT . Kayan nokta sayıları gerçek sayıların yaklaşık temsilidir ve tam değildir. Aslında, 0.01 gibi basit sayıların FLOAT veya DOUBLE tiplerinde tam bir temsili yoktur.

DECIMAL sütunları tam temsillerdir, ancak olası daha küçük sayı aralıkları için çok daha fazla yer kaplarlar. İstediğiniz gibi 0.0001'den 99.9999'a kadar değerleri tutabilen bir sütun oluşturmak için aşağıdaki ifadeye ihtiyacınız olacaktır

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

Sütun tanımı DECIMAL (M, D) biçimini izler; burada M , maksimum basamak sayısı ( kesinlik ) ve D , ondalık basamağın ( ölçek ) sağındaki basamak sayısıdır .

Bu, önceki komutun -99.9999 ile 99.9999 arasındaki değerleri kabul eden bir sütun oluşturduğu anlamına gelir. Ayrıca 0.0000 ila 99.9999 arasında bir İMZA EDİLMEMİŞ DECIMAL sütunu da oluşturabilirsiniz.

MySQL DECIMAL hakkında daha fazla bilgi için resmi dokümanlar her zaman mükemmel bir kaynaktır.

Tüm bu bilgilerin MySQL 5.0.3 ve sonraki sürümleri için geçerli olduğunu unutmayın. Önceki sürümleri kullanıyorsanız, gerçekten yükseltmeniz gerekir.


17
Cevabınızı oyladı. Cevabınız doğru, diğer cevap doğru değil ("çift = ondalık" olduğunu iddia ettiği için). DECIMAL, tam değeri olan sabit noktalı bir türdür ve eş anlamlıları NUMERIC, DEC ve FIXED'dir. DOUBLE değil, çünkü DOUBLE yaklaşık sayısal veri değerlerini temsil eden bir kayan noktalı türdür. DECIMAL (<1-65>, <0-30>) kullanılırken, ilk parametre basamak sayısı, ikincisi ondalık noktasının sağındaki basamak sayısıdır.
Norbert

2
Evet haklısın. MySQL 5.0.3 ve sonrası için işe yaradığını unutmayın, dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html
ajreal

1
Poster, 0.0001 ile 99.9999 arasında değerleri tutan ondalık bir alan istedi. Oluşturulan alanın gerçekten -99.9999 ile 99.9999 arasındaki değerleri desteklediğini açıklığa kavuşturmak için bazı ek bilgiler ekledim. Geri dönüşünüz için teşekkür ederiz! Ayrıca MySQL sürüm feragatnamesi eklendi.
Alex Recarey

1
"" İmzasız "DECIMAL sütunu" oluşturmanın bir yolu yok, ancak kod örneğiniz "DECIMAL (6,4) UNSIGNED NULL değil" ifadesini kullandınız. Bu neden?
liang

3
@AlexRecarey Ben iyi bir DECIMAL UNSIGNED oluşturmak mümkün gibi görünüyor; ve MySQL 5.x için manuel kabul eder: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Negatif değerler için aralık dışı bir hata döndürür. Aynı şekilde imzasız FLOAT ve DOUBLE oluşturabilirsiniz. El kitabı: dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
Markus AO

67

Yukarıdaki cevaplar doğru görünse de, size nasıl çalıştığı hakkında bir fikir vermek için basit bir açıklama.

Sütununun olarak ayarlandığını varsayalım DECIMAL(13,4). Bu, sütunun toplam 13 basamak büyüklüğüne sahip olacağı, bunlardan 4'ünün hassas gösterim için kullanılacağı anlamına gelir.

Özet olarak, bu sütun için maksimum değeriniz olacaktır: 999999999.9999


1
En iyi cevap
Julian Silvestri

15

Yorumlarda doğru çözümler var, ancak bunları tek bir cevapta özetlemek gerekirse:

DECIMAL (6,4) kullanmalısınız.

Sonra ondalık noktadan (ölçek) önce 2 ve 4 olmak üzere 6 toplam basamak sayısına sahip olabilirsiniz. Göre En azından bu .


6

MySQL 5.x şartname ondalık veri türü içindir: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Yukarıdaki cevap imzasız ondalık sayıların mümkün olmadığını söylemekte yanlıştır.

Ondalık değerler 4 tanesi 6 basamak, toplam uzunluğu sadece işaretsiz ondalık sayılar sağlayan bir alan tanımlamak üzere, kullanmak: DECIMAL (6,4) UNSIGNED.

Aynı şekilde imzasız (yani negatif olmayan) FLOAT ve DOUBLE veri türleri oluşturabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.