MySQLデータベースにたくさんのレコードを保存したいです。それらのすべてはお金の価値が含まれています。しかし、各桁に何桁挿入されるのかわかりません。
この目的のためにどのデータタイプを使用する必要がありますか?
VARCHARまたはINT(または他の数値データ型)
お金には正確な表現が必要なので、float
のような近似値にすぎないデータ型は使わないでください。これには固定小数点数値データ型を使用できます。
decimal(15,2)
15
は精度(小数点以下の桁数を含む値の全長)です2
は小数点以下の桁数ですMySQL数値型 を参照してください。
これらの型は、金額データのように正確な精度を保持することが重要な場合に使用されます。
BIGINT
を使用して、値を整数に100で乗算して格納することを好みます。
たとえば、93.49
の通貨値を表すには、値を9349
として保存し、値を表示しながら100で除算しますおよび表示。これにより、使用するストレージスペースが少なくなります。
注意:
ほとんどの場合、currency * currency
乗算を実行しません。これを実行する場合、結果を100で除算してストアし、適切な精度に戻ります。
それはあなたの必要性によります。
通常DECIMAL(10,2)
を使用すれば十分ですが、もう少し正確な値が必要な場合はDECIMAL(10,4)
を設定できます。
大きな値を扱う場合は、10
を19
に置き換えます。
あなたのアプリケーションが最大で1兆までの金額を処理する必要がある場合、これでうまくいくはずです。
通常、13,4に出力を四捨五入する前に13,4であなたのお金の値を合計する必要があります。
確かにこれはプログラマの好みに依存します。私は個人的に使用します:numeric(15,4)
は一般に認められている会計原則(GAAP)に準拠するためです。
当時、この質問はBitcoinの価格について誰も考えていませんでした。 BTCの場合、おそらくDECIMAL(15,2)
を使うのは不十分です。 Bitcoinが10万ドル以上になると、私たちのアプリで暗号通貨をサポートするには少なくともDECIMAL(18,9)
が必要になります。
MySQLでは、DECIMAL(18,9)
は12バイトのスペースを取ります( 9桁あたり4バイト )。
使ってみる
Decimal(19,4)
これは通常他のすべてのDBでも動作します
double
を使用します。* gasp *
小数点の位置に制約なしで、15桁の数字を表すことができるため。すべてわずか8バイトです!
したがって、以下を表すことができます。
0.123456789012345
123456789012345.0
...そしてその間にあるもの。
グローバル通貨を扱っているため、これは便利です。double
は、遭遇する可能性のあるさまざまな小数点以下の桁数を格納できます。
単一のdouble
フィールドは、999,999,999,999,999を日本円で、9,999,999,999,999.99を米ドルで、さらに9,999,999.99999999をビットコインで表すことができます
decimal
で同じことをしようとすると、14バイトのdecimal(30, 15)
が必要です。
もちろん、double
の使用には注意が必要です。
ただし、そうではない一部の人が指摘する傾向があるため、精度が低下します。 double
自体は、ベース10システムに対して内部的に正確ではないかもしれませんが、値を丸めるによって正確にすることができます小数点以下の桁。必要に応じて。 (たとえば、出力する場合、10進表記が必要です。)
警告は、算術演算を実行するときはいつでも、結果を正規化する必要があります(小数点以下の有効桁数に丸める):
別の種類の注意点は、データベースがプログラムがm
桁以上の数字を挿入することを妨げるdecimal(m, d)
とは異なり、double
にはそのような検証は存在しません。プログラムは、ユーザーが入力した20桁の値を挿入すると、不正確な量として静かに記録されることになります。
BIGINT
に100以上を掛けて保存スペースを少なくするという理由でお金を格納することは、すべての「通常の」状況では意味がありません。
DECIMAL(13,4)
に通貨を格納すれば十分です。DECIMAL
を格納するには9桁あたり4バイトが必要です。DECIMAL(13,4)
は9桁+ 4小数桁(小数点以下)を表します=> 4 + 2バイト= 6バイトBIGINT
を格納するのに必要な8バイトと比較してください。Visual BasicおよびOfficeの "Currency"のように、10000を掛けてBIGINTとして保存します。 https://msdn.Microsoft.com/ja-jp/library/office/gg264338.aspx を参照してください。