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


279

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


13
deimal(10,2)私が使用するものです...予想されるサイズに応じて値を調整できます
Manse

9
関連する質問は、通貨に最適なデータ型です ;)。
shA.t 2015

回答:


370

お金は正確な表現を必要とするので、のように近似するだけのデータ型を使用しないでくださいfloat。あなたはそのようなもののために固定小数点数値データ型を使用することができます

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

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

これらのタイプは、正確な精度を維持することが重要な場合、たとえば通貨データで使用されます。


3
この場合の10進数と数値のデータ型の違いは何ですか?
エミリオゴート2014

60
MySQLでは decimalnumeric同じです。
juergen d 2014

21
私は個人的にnumeric(19,4)、あなたが新しい要求を簡単に再生し、採用するためのより良い手を提供する財務記録に使用します。
YahyaE 2015

10
私はYahyaEに同意します、小数点以下が多いほど良いです。バーレーン、ヨルダン、クウェートディナールなど、小数点以下3桁を使用する通貨がいくつかあるため、少なくとも3が必要です。4または5の方が適しています。
Edwin Hoogerbeets

1
@EdwinHoogerbeets会計士ではない...しかし英国で小さなビジネスを運営している...私は昔、どこかの場所で読んだことを覚えている特定のあいまいなアカウンティングコンテキストで、実際に小数点以下2桁を使用します。Wdは、確認/反駁するために会計士を必要としています。
マイクげっ歯類

88

使用できるDECIMALNUMERIC、どちらも同じです

DECIMALおよびNUMERICタイプは、正確な数値データ値を格納します。これらのタイプは、正確な精度を維持することが重要な場合、たとえば通貨データで使用されます。MySQLでは、NUMERICはDECIMALとして実装されているため、以下のDECIMALに関する注記はNUMERICにも同様に適用されます。:MySQL

すなわち DECIMAL(10,2)

設定例

よく読んだ


3
混乱するかもしれませんが、スクリーンショットが回答テキスト(精度、スケール)と一致していません。
Patrick Hofman、2014

金額の値にdecimal(10,2)を使用していますが、867,000.00などを入力すると、867として保存されます。何が問題なのですか?
codeinprogress 2017年

32

私はを使用しBIGINT、値を100乗算して格納し、整数になるようにします。

たとえば、の通貨値を表すに93.49は、値をとして保存し9349100除算して表示できる値を表示します。これにより、ストレージ容量が少なくなります。

注意:
ほとんどのcurrency * currency場合、乗算を実行しません。実行している場合は、結果を100で除算して格納し、適切な精度に戻るようにします。


私のコンピューターシステムの大学のコースの教授から同様のことを言われたことを覚えています。最も正確な方法は、100を掛けて整数として保存し、100で割ってユーザーに表示することで、1セント(または1セント)で保管することです。これには、データベースシステムの精度とパフォーマンスの点でメリットがあると思います。
LondonAppDev 2015

11
上の利点は何DECIMALですか?ペニーをドルに換算する必要が生じ、ある時点でそれを忘れると悲惨になります。

1
スペースが唯一の利点ですが、この機能を使用するときは注意が必要です。
Dinesh PR

4
それが明らかでない場合:小数セントでお金を格納する場合、スケール除去方法の使用に注意してください(例:$0.005または$0.12345)。100を掛けても整数に減らないためです。値の精度がわかっている場合は、最適なオプションはを使用することDECIMALです。しかし、(私の例のように)精度がわからない場合は… FLOAT適切でしょうか?
Quinn Comendant 2015

1
このメソッドの利点は、IEEE-754を使用して浮動小数点数を格納するJavaScriptのような言語を使用する場合です。この仕様は、0.1 + 0.2 === 0.3が真であることを保証するものではありません。通貨を整数として保存すると、アプリケーションでそのようなエラーが発生しないことが確実になります。ただし、これは最善の解決策ではない可能性があります。解決策を研究しているときにこのページにたどり着きましたが、まだ完了していません。
Gary Ott

27

それはあなたの必要性に依存します。

使用してDECIMAL(10,2)、あなたが設定することができもう少し正確な値が必要な場合は、通常は十分ですがDECIMAL(10,4)

大きな値を扱う場合は、に置き換え10てください19


金額の値にdecimal(10,2)を使用していますが、867,000.00などを入力すると、867として保存されます。何が問題なのですか?
codeinprogress 2017年

2
@codeinprogress間違ったロケール/小数点区切り文字を使用していますか?
DavidBalažic2017年

15

アプリケーションが1兆までの金額の値を処理する必要がある場合、これは機能するはずです。13、2 GAAP(一般に認められた会計原則)に準拠する必要がある場合は、次を使用します:13,4

通常、出力を13.2に丸める前に、金額を13,4で合計する必要があります。


5
ビットコインを取る場合は、小数点以下8桁が必要になりますが、ほとんどのウォレットはmBTCに送られます。これは3 en.wikipedia.org/wiki/Bitcoin
Christian

この答えは本当だとは思わないでください。opendata.stackexchange.com/a/10348/13983 @ david.eeがそのソースを取得しましたか?
Evan Carroll、

@EvanCarrollがdavid.eeに回答させていただきます。この記事が出典かもしれませんrietta.com/blog/2012/03/03/best-data-types-for-currencymoney-in
naXa

@naXaリンクは、GAAPに13,4を使用するという主張をサポートするソースからの引用はありません。あなたがしたのは同じ根拠のない主張をする記事へのリンクだけでした。
iheanyi

6

実際、これはプログラマーの好みに依存しています。私は個人的に以下を使用します:一般に認められた会計原則(GAAPnumeric(15,4)に準拠するため。


5
「プログラマーの好み」や「個人的に使用するもの」とは何の関係もありません。これは、10進数の基数を必要とする問題ドメインによって決定されます。これは、プログラマが自分の個人的な好みを行使することになる問題ではありません。
ローン侯爵、2015


3

使用していますdouble

*ガスプ*

どうして?

それは小数点がどこにあるかの制約なしで 15桁の数表すことができるからです。全部で8バイトです!

だからそれは表すことができます:

  • 0.123456789012345
  • 123456789012345.0

...そしてその間のすべて。

これは、我々が扱っているので便利ですグローバル通貨、そしてdouble私たちよそうな出会い小数点以下の桁数のさまざまな数値を格納することができます。

1つのdoubleフィールドで999,999,999,999,999秒の日本円、9,999,999,999,999.99秒の米ドル、さらに9,999,999.99999999秒のビットコインを表すことができます

で同じことをしようとするとdecimaldecimal(30, 15)14バイトのコストが必要になります。

注意事項

もちろん、使用にdoubleは警告がないわけではありません。

ただし、指摘されがちな精度の低下ではありません。にもかかわらずdouble、それ自体ができない場合があり、内部で正確なベース10システムに、我々は正確な、それを作ることができる値丸め、我々はその重要な小数点以下の桁数にデータベースから引き出しますが。必要な場合です。(例えば、出力される場合、base 10表現が必要です。)

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

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

別の種類の警告は、decimal(m, d)データベースがプログラムが数字を超える数を挿入することを防ぐ場合とは異なり、そのmような検証はで存在しないことdoubleです。プログラムは、ユーザーが入力した20桁の値を挿入する可能性があり、不正確な量として静かに記録されることになります。


このような答えを初めて見たのは興味深いです。Q:1.41のようなfloatをデータベースに書き込んだ場合、何らかの理由でmysqlの巨大な数値(1.000.000.000.000など)を掛ける必要があります。丸められた結果は正確に1.410.000.000.000になりますか?
roelleor

@roelleor結果が正確に1,410,000,000,000(千桁区切りのコンマ)になるように、入力は1.410000000000(小数点以下12桁)と見なされますが、1,000,000,000,000(小数点の左側の13桁)を掛けると、少なくとも、有効桁数の合計25桁。これはダブルで利用可能な15をはるかに超えているので、デザイン的には非常に壊れると思います。
アンタック

2

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

DECIMAL(18,9)MySQLでは12バイトのスペースが必要です(9桁あたり4バイト)。


>ビットコインは小数点以下8桁まで分割できます。したがって、0.00000001 BTCは、トランザクションで処理できる最小金額です。私はあなたが9ではなく8を意味すると思いますか?
danger89

1
私は知っていますが、9は8と同じディスク容量を使用します。MySQLドキュメントから:「10進数の9桁を4バイトにパックするバイナリ形式を使用してDECIMAL列の値が保存されます」
bizwiz

申し訳ありませんが、今私はあなたを取得します。ありがとう。
danger89

2

BIGINT100倍以上の金額を保管することで、使用する保管スペースを少なくする理由は、すべての「通常の」状況では意味がありません。

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.