Birçok kaydı bir MySQL veritabanında saklamak istiyorum. Hepsi para değerleri içerir. Ama her biri için kaç basamak ekleneceğini bilmiyorum.
Bu amaçla hangi veri türünü kullanmam gerekiyor?
VARCHAR veya INT (veya diğer sayısal veri türleri)?
Birçok kaydı bir MySQL veritabanında saklamak istiyorum. Hepsi para değerleri içerir. Ama her biri için kaç basamak ekleneceğini bilmiyorum.
Bu amaçla hangi veri türünü kullanmam gerekiyor?
VARCHAR veya INT (veya diğer sayısal veri türleri)?
Yanıtlar:
Paranın tam bir temsile ihtiyacı olduğundan, sadece yaklaşık olarak benzer veri türlerini kullanmayın float
. Bunun için sabit noktalı bir sayısal veri türü kullanabilirsiniz
decimal(15,2)
15
kesinliktir (ondalık basamaklar dahil toplam değer uzunluğu)2
ondalık noktadan sonraki basamak sayısıBkz. MySQL Sayısal Türleri :
Bu türler, örneğin parasal veriler gibi kesin doğruluğun korunması önemli olduğunda kullanılır .
decimal
ve numeric
aynı.
numeric(19,4)
yeni talepleri kolayca oynamanız ve benimsemeniz için daha iyi bir el sağlayan finansal kayıtlar için kullanıyorum .
Kullanabilirsiniz DECIMAL
veya NUMERIC
her ikisi de aynı
DECIMAL ve NUMERIC türleri kesin sayısal veri değerlerini saklar. Bu türler, örneğin parasal veriler gibi kesin doğruluğun korunması önemli olduğunda kullanılır. MySQL'de NUMERIC DECIMAL olarak uygulanır, bu nedenle DECIMAL ile ilgili aşağıdaki açıklamalar NUMERIC için eşit olarak geçerlidir. : MySQL
yani DECIMAL(10,2)
Tamsayı olması BIGINT
için değerleri 100 ile çarpmayı kullanmayı ve saklamayı tercih ederim .
Örneğin, bir para birimi değerini temsil etmek için , değer 100'e bölebileceğimiz ve gösterebileceğimiz değeri görüntülerken 93.49
olarak kaydedilecektir . Bu daha az depolama alanı kaplar.9349
Dikkat:
Çoğunluklacurrency * currency
çarpma yapmayız , eğer yaparsak sonucu 100'e bölüp saklayın, böylece doğru hassasiyete geri döner.
DECIMAL
? Pennileri dolara çevirmeye ihtiyaç duyuyorsun ve bir noktada unutursan vahim.
$0.005
Veya $0.12345
) depolarsanız ölçek kaldırma yöntemini kullanmaya dikkat edin, çünkü 100 ile çarpıldıktan sonra bir tam sayıya düşmeyeceklerdir. Değerlerin kesinliğini biliyorsanız, en iyi seçenek kullanmaktır DECIMAL
. Ama kesinliği bilmiyorsanız (örneklerimdeki gibi) o zaman… FLOAT
uygun olur mu?
İhtiyacınıza göre değişir.
DECIMAL(10,2)
Genellikle kullanmak yeterlidir, ancak biraz daha kesin değerlere ihtiyacınız varsa ayarlayabilirsiniz DECIMAL(10,4)
.
Büyük değerler yerine birlikte Eğer çalışıyorsanız 10
ile 19
.
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.
Aslında bu programcının tercihlerine dayanmaktadır. Şahsen ben kullanıyorum: Genel Kabul Görmüş Muhasebe İlkelerine ( GAAP )numeric(15,4)
uymak için .
double
.* Gasp *
Ondalık noktasının nerede olduğu konusunda herhangi bir kısıtlama olmaksızın 15 haneli herhangi bir sayıyı temsil edebildiğinden . Her şey 8 bayt için!
Yani şunları temsil edebilir:
0.123456789012345
123456789012345.0
... ve aradaki her şeyi.
Bu yararlıdır çünkü küresel para birimleriyle uğraşıyoruz vedouble
muhtemelen karşılaşacağımız çeşitli ondalık basamakları saklayabiliriz.
Tek bir double
alan Japon yeni cinsinden 999,999,999,999,999'ları, ABD doları cinsinden 9,999,999,999,999,99'ları ve hatta bitcoin olarak 9,999,999,9999999'ları temsil edebilir.
Eğer aynısını yapmaya çalışırsanız decimal
,decimal(30, 15)
14 bayta mal .
Tabii ki, double
uyarılar olmadan değil.
Bununla birlikte, bazıları belirtildiği gibi doğruluk kaybı değildir . Rağmen double
kendisi olmayabilir taban 10 sistemine içten kesin , biz bunu kesin yapabilir değerini yuvarlama biz onun önemli ondalık basamağa veritabanından çekin. Gerekirse. (örneğin, çıktı alınacaksa ve temel 10 gösterimi gerekiyorsa.)
Uyarılar, onunla aritmetik yaptığımız her zaman, sonucu daha önce normalleştirmemiz gerekir (önemli ondalık basamaklara yuvarlayarak):
Başka bir uyarı, decimal(m, d)
veritabanının programların m
rakamdan daha fazla rakam eklemesini engellediği durumun aksine , böyle bir doğrulama yoktur double
. Bir program, kullanıcı tarafından girilen 20 basamaklı bir değer girebilir ve sonuç olarak sessizce yanlış bir tutar olarak kaydedilir.
1.410000000000
(on iki önemli ondalık basamak) olduğu varsayılır , ancak bunun 1.000.000.000.000 ile çarpılması (ondalık noktadan 13 önemli basamak olan) en az 25 basamaklı bir anlamlılık. Bu, bir çift için mevcut 15'i geçiyor, bu yüzden tasarım açısından çok kırılacağını düşünüyorum.
O zaman bu soruya kimsenin Bitcoin fiyatı hakkında düşünmediği soruldu. BTC durumunda, muhtemelen kullanmak yetersizdir DECIMAL(15,2)
. Bitcoin 100.000 dolara veya daha fazlaya yükselecekse, en azından DECIMAL(18,9)
uygulamalarımızdaki kripto para birimlerini desteklememiz gerekecek .
DECIMAL(18,9)
MySQL'de 12 bayt yer kaplar ( 9 basamak başına 4 bayt ).
BIGINT
Daha az depolama alanı kullanma nedeni ile 100 veya daha fazla ile para depolamak tüm "normal" durumlarda mantıklı değildir.
DECIMAL(13,4)
DECIMAL
.
DECIMAL(13,4)
9 basamağı + 4 kesir basamağını temsil eder (ondalık basamaklar) => 4 + 2 bayt = 6 baytBIGINT
.GAAP Uyumluluğu gerekiyorsa veya 4 ondalık basamağa ihtiyacınız varsa:
Maksimum değeri destekleyen DECIMAL (13, 4):
$ 999,999,999.9999
Aksi takdirde, 2 ondalık basamak yeterliyse: DECIMAL (13,2)
src: https://rietta.com/blog/best-data-types-for-currencymoney-in/
10000'i çarpar ve Visual Basic ve Office'te "Para birimi" gibi BIGINT olarak depolar. Bkz. Https://msdn.microsoft.com/en-us/library/office/gg264338.aspx
deimal(10,2)
kullandığım şey ... değerleri beklenen boyuta göre ayarlayabilirsiniz