web-dev-qa-db-ja.com

PostgreSQL:通貨に使用するデータ型はどれですか?

Moneyタイプは、説明されているように推奨されないようです here

アプリケーションは通貨を格納する必要がありますが、どのデータ型を使用する必要がありますか?数値、お金、またはフロート?

105
daydreamer

数値 2単位の精度を強制します。通貨を表すためにフロートまたはフロートのようなデータ型を使用しないでください。そうすると、財務レポートの最終的な数字が+または-数ドル分間違っていると人々は不幸になります。

私が知る限り、お金の種類は歴史的な理由で残されています。

75
Chris Farmiloe

あなたの情報源は決して公式ではありません。それは2011年にさかのぼります、そして、著者さえ認めません。お金の種類が「検出されない」場合、PostgreSQLはマニュアルでそう言います- これはしません

より公式なソースについては、 pgsql-generalのこのスレッド(今週から!) を、コアからのステートメントとともにD'Arcy JM Cain(マネータイプの元著者)およびTom Laneを含む開発者:

基本的に、 money には(制限された)用途があります。 numericを超える利点は、performanceです。

decimal は、Postgresのnumericの単なるエイリアスです。

最近のリリースの改善に関する関連する回答(およびコメント!):

個人的には、通貨を integer として保存するのが好きです。これは、前述のオプションのいずれよりも効率的です。

94

選択肢は次のとおりです。

  1. integer:金額をセントで保存します。これはEFTPOSトランザクションが使用するものです。
  2. decimal(12,2):小数点以下2桁で金額を保存します。これは、最も一般的な元帳ソフトウェアが使用するものです。
  3. float:ひどいアイデア-不十分な精度。これは、素朴な開発者が使用するものです。

オプション2は、最も一般的で簡単に使用できます。精度(この例では12、合計で12桁を意味します)を、あなたに最適な大きさとするか、小さくします。

計算の結果である複数のトランザクション(たとえば、為替レートを含む)をビジネス上の意味を持つ単一の値に集約する場合、正確なマクロ値を提供するには精度を高くする必要があることに注意してください。 decimal(18, 8)のようなものを使用することを検討してください。合計が正確で、個々の値を表示のためにセント精度に丸めることができます。

58
Bohemian

私はすべての金銭分野を次のように保持しています。

numeric(15,6)

小数点以下の桁数を多くすることは過剰に思えますが、複数の通貨を処理する必要がある可能性がわずかでもある場合、変換するためにそのような精度が必要になります。ユーザーに何を提示しようとも、私は常に米ドルに保管します。そのようにして、当日の変換レートを考えると、他の通貨に容易に変換できます。

1つの通貨以外は何もしない場合、ここで最悪なのは、ゼロを格納するために少しスペースを無駄にすることです。

20

bigintとして保存されている64ビット整数を使用します

マイクロドル(または同様の主要通貨)を使用することをお勧めします。マイクロは100万分の1を意味するため、1マイクロドル= 0.000001ドルです。

  • セントの端数を処理するのに十分な精度。
  • 非常に小さな単位あたりの価格設定(広告の表示回数やAPI料金など)に適しています。
  • 使いやすく、すべての言語と互換性があります。
  • 文字列や数値よりも小さいストレージのデータサイズ。
  • 計算によって精度を維持しやすく、最終出力で丸めを適用します。
8
Mani Gandham