MySQLデータベースに多くのレコードを保存したい。それらのすべてがお金の価値を含んでいます。しかし、私はそれぞれに何桁挿入されるのかわかりません。
この目的のためにどのデータ型を使用する必要がありますか?
VARCHARまたはINT(または他の数値データ型)?
MySQLデータベースに多くのレコードを保存したい。それらのすべてがお金の価値を含んでいます。しかし、私はそれぞれに何桁挿入されるのかわかりません。
この目的のためにどのデータ型を使用する必要がありますか?
VARCHARまたはINT(または他の数値データ型)?
回答:
お金は正確な表現を必要とするので、のように近似するだけのデータ型を使用しないでくださいfloat
。あなたはそのようなもののために固定小数点数値データ型を使用することができます
decimal(15,2)
15
精度(小数点以下を含む値の全長)2
小数点以下の桁数ですMySQL数値型を参照してください。
これらのタイプは、正確な精度を維持することが重要な場合、たとえば通貨データで使用されます。
decimal
とnumeric
同じです。
numeric(19,4)
、あなたが新しい要求を簡単に再生し、採用するためのより良い手を提供する財務記録に使用します。
使用できるDECIMAL
かNUMERIC
、どちらも同じです
DECIMALおよびNUMERICタイプは、正確な数値データ値を格納します。これらのタイプは、正確な精度を維持することが重要な場合、たとえば通貨データで使用されます。MySQLでは、NUMERICはDECIMALとして実装されているため、以下のDECIMALに関する注記はNUMERICにも同様に適用されます。:MySQL
すなわち DECIMAL(10,2)
私はを使用しBIGINT
、値を100で乗算して格納し、整数になるようにします。
たとえば、の通貨値を表すに93.49
は、値をとして保存し9349
、100で除算して表示できる値を表示します。これにより、ストレージ容量が少なくなります。
注意:
ほとんどのcurrency * currency
場合、乗算を実行しません。実行している場合は、結果を100で除算して格納し、適切な精度に戻るようにします。
$0.005
または$0.12345
)。100を掛けても整数に減らないためです。値の精度がわかっている場合は、最適なオプションはを使用することDECIMAL
です。しかし、(私の例のように)精度がわからない場合は… FLOAT
適切でしょうか?
それはあなたの必要性に依存します。
使用してDECIMAL(10,2)
、あなたが設定することができもう少し正確な値が必要な場合は、通常は十分ですがDECIMAL(10,4)
。
大きな値を扱う場合は、に置き換え10
てください19
。
アプリケーションが1兆までの金額の値を処理する必要がある場合、これは機能するはずです。13、2 GAAP(一般に認められた会計原則)に準拠する必要がある場合は、次を使用します:13,4
通常、出力を13.2に丸める前に、金額を13,4で合計する必要があります。
実際、これはプログラマーの好みに依存しています。私は個人的に以下を使用します:一般に認められた会計原則(GAAP)numeric(15,4)
に準拠するため。
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秒のビットコインを表すことができます
で同じことをしようとするとdecimal
、decimal(30, 15)
14バイトのコストが必要になります。
もちろん、使用にdouble
は警告がないわけではありません。
ただし、指摘されがちな精度の低下ではありません。にもかかわらずdouble
、それ自体ができない場合があり、内部で正確なベース10システムに、我々は正確な、それを作ることができる値丸め、我々はその重要な小数点以下の桁数にデータベースから引き出しますが。必要な場合です。(例えば、出力される場合、base 10表現が必要です。)
警告は、それを使って算術を実行するときはいつでも、その前に結果を正規化する必要があります(小数点以下の有効桁数に丸める)。
別の種類の警告は、decimal(m, d)
データベースがプログラムが数字を超える数を挿入することを防ぐ場合とは異なり、そのm
ような検証はで存在しないことdouble
です。プログラムは、ユーザーが入力した20桁の値を挿入する可能性があり、不正確な量として静かに記録されることになります。
1.410000000000
(小数点以下12桁)と見なされますが、1,000,000,000,000(小数点の左側の13桁)を掛けると、少なくとも、有効桁数の合計25桁。これはダブルで利用可能な15をはるかに超えているので、デザイン的には非常に壊れると思います。
当時、この質問はビットコインの価格について誰も考えていませんでした。BTCの場合、おそらくを使用するだけでは不十分DECIMAL(15,2)
です。ビットコインが100,000ドル以上になる場合、少なくともDECIMAL(18,9)
アプリで暗号通貨をサポートする必要があります。
DECIMAL(18,9)
MySQLでは12バイトのスペースが必要です(9桁あたり4バイト)。
BIGINT
100倍以上の金額を保管することで、使用する保管スペースを少なくする理由は、すべての「通常の」状況では意味がありません。
DECIMAL(13,4)
DECIMAL
。
DECIMAL(13,4)
9桁+小数桁4桁(小数点以下の桁数)を表す=> 4 + 2バイト= 6バイトBIGINT
。GAAPコンプライアンスが必要な場合、または小数点第4位が必要な場合:
DECIMAL(13、4)次の最大値をサポートします。
999,999,999.9999ドル
それ以外で、小数点以下2桁で十分な場合:DECIMAL(13,2)
src:https : //rietta.com/blog/best-data-types-for-currencymoney-in/
Visual BasicおよびOfficeの「通貨」のように、10000を乗算してBIGINTとして格納します。https://msdn.microsoft.com/en-us/library/office/gg264338.aspxを参照してください
deimal(10,2)
私が使用するものです...予想されるサイズに応じて値を調整できます