MySQL データベースに多くのレコードを保存したいと考えています。それらのすべてにお金の値が含まれています。しかし、それぞれに何桁が挿入されるかはわかりません。
この目的のためにどのデータ型を使用する必要がありますか?
VARCHARまたはINT (またはその他の数値データ型)?
12 に答える
お金は正確な表現が必要なので、 のように近似的なデータ型を使用しないでくださいfloat
。次のような固定小数点数値データ型を使用できます
decimal(15,2)
15
は精度です (小数点以下を含む値の全長)2
は小数点以下の桁数です
MySQL 数値型を参照してください。
これらの型は、通貨データなど、正確な精度を維持することが重要な場合に使用されます。
私は を使用し、値を 100 で乗算してBIGINT
格納することを好み、整数になるようにします。
たとえば、 の通貨値を表すには93.49
、値を として保存し、 100 で割って9349
表示できる値を表示します。これにより、使用するストレージ スペースが少なくなります。
注意:
ほとんどの場合、乗算は実行しません。実行currency * currency
する場合は、結果を 100 で除算して格納し、適切な精度に戻します。
アプリケーションが 1 兆ドルまでの金額を処理する必要がある場合、これは機能するはずです: 13,2 GAAP (一般に認められた会計原則) に準拠する必要がある場合は、次を使用します: 13,4
通常、出力を 13,2 に丸める前に、13,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 を表すことができます。
で同じことをしようとすると、 14 バイトのコストdecimal
が必要になります。decimal(30, 15)
注意事項
もちろん、使用double
には警告がないわけではありません。
ただし、一部の人が指摘する傾向があるように、精度が失われるわけではありません。それdouble
自体は内部的に 10 進法のシステムに対して正確ではないかもしれませんが、データベースから取得した値を小数点以下の有効桁数に丸めることで正確にすることができます。必要ならそれで。(例: 出力する予定で、基数 10 の表現が必要な場合。)
警告は、それを使って算術を実行するときはいつでも、結果を正規化する必要があります (有効な小数点以下を四捨五入することによって)。
- その上で比較を実行します。
- データベースに書き戻します。
もう 1 つの警告は、decimal(m, d)
データベースがプログラムが桁数を超える数値を挿入するのを防止する場合とは異なり、.m
にはそのような検証が存在しないことdouble
です。プログラムは、ユーザーが入力した 20 桁の値を挿入する可能性があり、不正確な金額として黙って記録されることになります。
GAAP 準拠が必要な場合、または小数点以下 4 桁が必要な場合:
DECIMAL(13, 4) 次の最大値をサポートします。
$999,999,999.9999
それ以外の場合、小数点以下 2 桁で十分な場合: DECIMAL(13,2)
ソース: https://rietta.com/blog/best-data-types-for-currencymoney-in/
使ってみて
Decimal(19,4)
これは通常、他のすべてのDBでも機能します
Visual Basic や Office の「Currency」のように、10000 を乗算して BIGINT として格納します。https://msdn.microsoft.com/en-us/library/office/gg264338.aspxを参照してください