web-dev-qa-db-ja.com

MySQLに金額を格納するのに最適なデータ型

MySQLデータベースにたくさんのレコードを保存したいです。それらのすべてはお金の価値が含まれています。しかし、各桁に何桁挿入されるのかわかりません。
この目的のためにどのデータタイプを使用する必要がありますか?
VARCHARまたはINT(または他の数値データ型)

251
Mohammad Saberi

お金には正確な表現が必要なので、floatのような近似値にすぎないデータ型は使わないでください。これには固定小数点数値データ型を使用できます。

decimal(15,2)
  • 15は精度(小数点以下の桁数を含む値の全長)です
  • 2は小数点以下の桁数です

MySQL数値型 を参照してください。

これらの型は、金額データのように正確な精度を保持することが重要な場合に使用されます。

334
juergen d

DECIMALNUMERICはどちらも同じです

DECIMAL型とNUMERIC型は正確な数値データ値を格納します。これらの型は、通貨データなど、正確な精度を維持することが重要な場合に使用されます。 MySQLでは、NUMERICはDECIMALとして実装されているため、以下のDECIMALに関する説明はNUMERICにも同様に当てはまります。 : MySQL

すなわち、DECIMAL(10,2)

Example settings

読みやすい

83
NullPoiиteя

BIGINTを使用して、値を整数に100で乗算して格納することを好みます。

たとえば、93.49の通貨値を表すには、値を9349として保存し、値を表示しながら100で除算しますおよび表示。これにより、使用するストレージスペースが少なくなります。

注意:
ほとんどの場合、currency * currency乗算を実行しません。これを実行する場合、結果を100で除算してストアし、適切な精度に戻ります。

32
Dinesh P.R.

それはあなたの必要性によります。

通常DECIMAL(10,2)を使用すれば十分ですが、もう少し正確な値が必要な場合はDECIMAL(10,4)を設定できます。

大きな値を扱う場合は、1019に置き換えます。

26
Svetoslav

あなたのアプリケーションが最大で1兆までの金額を処理する必要がある場合、これでうまくいくはずです。

通常、13,4に出力を四捨五入する前に13,4であなたのお金の値を合計する必要があります。

14
david.ee

確かにこれはプログラマの好みに依存します。私は個人的に使用します:numeric(15,4)一般に認められている会計原則(GAAPに準拠するためです。

6
Chagbert

当時、この質問はBitcoinの価格について誰も考えていませんでした。 BTCの場合、おそらくDECIMAL(15,2)を使うのは不十分です。 Bitcoinが10万ドル以上になると、私たちのアプリで暗号通貨をサポートするには少なくともDECIMAL(18,9)が必要になります。

MySQLでは、DECIMAL(18,9)は12バイトのスペースを取ります( 9桁あたり4バイト )。

3
bizwiz

使ってみる

Decimal(19,4)

これは通常他のすべてのDBでも動作します

3
Deepesh

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進表記が必要です。)

警告は、算術演算を実行するときはいつでも、結果を正規化する必要があります(小数点以下の有効桁数に丸める):

  1. 比較を実行します。
  2. データベースに書き戻します。

別の種類の注意点は、データベースがプログラムがm桁以上の数字を挿入することを妨げるdecimal(m, d)とは異なり、doubleにはそのような検証は存在しません。プログラムは、ユーザーが入力した20桁の値を挿入すると、不正確な量として静かに記録されることになります。

3
antak

BIGINTに100以上を掛けて保存スペースを少なくするという理由でお金を格納することは、すべての「通常の」状況では意味がありません。

  • GAAPとの整合性を保つためには、DECIMAL(13,4)に通貨を格納すれば十分です。
  • MySQLのマニュアルによると、DECIMALを格納するには9桁あたり4バイトが必要です。
  • DECIMAL(13,4)は9桁+ 4小数桁(小数点以下)を表します=> 4 + 2バイト= 6バイト
  • BIGINTを格納するのに必要な8バイトと比較してください。
0
digitalstraw

Visual BasicおよびOfficeの "Currency"のように、10000を掛けてBIGINTとして保存します。 https://msdn.Microsoft.com/ja-jp/library/office/gg264338.aspx を参照してください。

0
auntyellow