Para birimi değerleri için en iyi SQL veri türü nedir? MySQL kullanıyorum ama veritabanından bağımsız bir türü tercih ederim.
Para birimi değerleri için en iyi SQL veri türü nedir? MySQL kullanıyorum ama veritabanından bağımsız bir türü tercih ederim.
Yanıtlar:
Decimal(19,4)
Çoğu durumda genellikle böyle bir şey oldukça iyi çalışır. Ölçeği ve hassasiyeti, saklamanız gereken sayıların gereksinimlerine uyacak şekilde ayarlayabilirsiniz. SQL Server'da bile money
standart olmayan " " kullanmama eğilimindeyim .
(19,4)
yerine kullanmanın yararı nedir (19,2)
?
Dikkat etmeniz gereken tek şey, bir veritabanından diğerine geçiş yaparsanız DECIMAL (19,4) ve DECIMAL (19,4) 'ün farklı şeyler ifade ettiğini görebilirsiniz.
( http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html )
DBASE: 10,5 (10 tam sayı, 5 ondalık) MYSQL: 15,5 (15 basamak, 10 tam sayı (15-5), 5 ondalık)
Hesaplamalarınız için kaç ondalık basamağın gerekli olabileceğini bulmak da önemlidir.
Bir milyon hissenin fiyatının hesaplanmasını gerektiren bir hisse fiyatı uygulaması üzerinde çalıştım. Kote edilen hisse fiyatının 7 basamak doğrulukta depolanması gerekiyordu.
Assaf'ın yanıtı
Ne kadar paranız olduğuna bağlı ...
kulağa ters geliyor, ama aslında uygun.
Yalnızca bugün Ücret tablosumuza bir kayıt eklenemediğinde bir sorun vardı, çünkü sütunlardan biri (GrossRate) Ondalık (11,4) olarak ayarlandı ve Ürün departmanımız bazı şaşırtıcı tesislerdeki odalar için bir sözleşme aldı Bora Bora'da gecelik birkaç milyon Pasifik Frangı satıyor ... veritabanı şeması 10 yıl önce tasarlandığında hiç beklenmeyen bir şey.
Muhasebe uygulamaları için değerleri tamsayı olarak saklamak çok yaygındır (bazıları bunun tek yol olduğunu söyleyecek kadar ileri gider ). Bir fikir edinmek için, ihtiyacınız olan doğruluğu elde etmek için işlem miktarını (100.23 $ diyelim) ve 100, 1000, 10000 vb. Yani sadece sentleri depolamanız gerekiyorsa ve güvenli bir şekilde yukarı veya aşağı yuvarlanabiliyorsanız, sadece 100 ile çarpın. Veritabanında yerden tasarruf edersiniz ve iki tamsayıyı karşılaştırmak iki kayan nokta karşılaştırmaktan daha kolaydır. Benim 0.02 $.
DECIMAL
? Uygun zamanlarda her zaman kuruşları, değirmenleri veya milyarları dolarlara çevirmek konusunda çok dikkatli olmanız gerekir .
süper geç giriş ama GAAP iyi bir kural.
Başvurunuzun bir trilyona kadar para değerlerini işlemesi gerekiyorsa, bunun çalışması gerekir: 13,2 GAAP (Genel Kabul Görmüş Muhasebe İlkeleri) ile uyumlu olmanız gerekiyorsa şunu kullanın: 13,4
Çıktının 13,2'ye yuvarlanmasından önce genellikle para değerlerinizi 13,4 olarak toplamalısınız.
Kaynak: Parasal değeri MySQL'de depolamak için en iyi veri türü
DECIMAL(19,2)
Tüm parasal değerleriniz için varsayılan olarak benzer bir şey kullanabilirsiniz , ancak yalnızca 1.000 $ 'ın altındaki değerleri depolarsanız, bu sadece değerli veritabanı alanı kaybı olacaktır.
Çoğu uygulama için, DECIMAL(N,2)
değeri, bu alanda depolanmasını beklediğiniz en büyük toplamdan N
önceki en az hane sayısı olduğunda yeterli olacaktır . Bu nedenle, 999999,99'dan daha büyük bir değer depolamayı beklemiyorsanız, (beklentiler değişene kadar) fazlasıyla yeterli olmalıdır..
+ 5
DECIMAL(11,2)
Eğer olmak istiyorsan GAAP sürekli uyumluluk, sen ile gidebiliriz DECIMAL(N,4)
değeri nerede, N
önceki hane sayısı en az olan .
hiç bu alanda depolanacak bekliyoruz büyük toplamının + 7
.
Verilerin doğasına bağlıdır. Önceden düşünmeniz gerekiyor.
Her ne kadar MySQL ondalık (65,30) kullanmanıza izin verse de, transfer seçeneğini açık bırakmak istiyorsak ölçek için 31 ve hassasiyet için 30 sınırlarımız gibi görünüyor.
En yaygın RDBMS'de maksimum ölçek ve hassasiyet:
Hassas ölçek Oracle 31 31 T-SQL 38 38 MySQL 65 30 PostgreSQL 131072 16383
Eylül 2015 Zimbabwe hükümeti Zimbabwe Doları'nı 1 ABD Doları ile 35 katrilyon Zimbabwe Doları karşılığında değiştireceğini açıkladı 5
"Evet, elbette ... O çılgın figürlere ihtiyacım olmayacak" diyoruz. Zimbabweans bunu da söylerdi. Çok uzun zaman önce değil.
Zimbabwe doları cinsinden 1 milyon dolarlık bir işlem kaydetmeniz gerektiğini düşünelim (belki bugün pek mümkün değil, ancak bundan 10 yıl sonra nasıl görüneceğini kim bilebilir?).
- (1 milyon USD) * (35 Quadrylion ZWL) = (10 ^ 6) * (35 * 10 ^ 15) = 35 * 10 ^ 21
- ihtiyacımız var:
- "35" depolamak için 2 hane
- Sıfırları saklamak için 21 basamak
- Ondalık noktasının sağındaki 4 basamak
- bu, her giriş için bize 15 bayta mal olan ondalık sayı (27,4) yapar
- sol tarafa ücretsiz olarak bir rakam daha ekleyebiliriz - 15 bayt için ondalık (28,4) var
- Şimdi Zimbabwe doları cinsinden ifade edilen 10 milyon dolarlık işlemi saklayabiliriz veya umarız olmayacak olan başka bir hiperinflasyon grevinden koruyabiliriz