182

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

私のアプリケーションは通貨を保存する必要があります。どのデータ型を使用すればよいですか? 数値、マネー、またはフロート?

4

6 に答える 6

149

あなたの情報源は決して公式ではありません。それは2011年にさかのぼり、私は作者さえ認識していません。money 型が公式に「推奨されない」場合、PostgreSQL はマニュアルでそう言っていますが、そうではありません

より公式な情報源については、pgsql-general のこのスレッド (ちょうど今週から!) を読んでください。D'Arcy JM Cain (money 型の最初の作成者) や Tom Lane などのコア開発者からの声明が含まれています。

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

基本的に、moneyその(非常に限られた)用途があります。Postgres Wikiは、限定的に定義された場合を除いて、それをほとんど避けることを提案しています。以上の利点numericパフォーマンスです。

decimalPostgresの単なるエイリアスでnumericあり、通貨データに広く使用されており、「任意精度」タイプです。マニュアル:

この型numericは、桁数が非常に多い数値を格納できます。正確さが要求される金額やその他の数量を格納する場合に特にお勧めします。

integer個人的には、小数のセントが発生しない場合 (基本的にお金が意味を持つ場合) は、通貨をセントとして保存するのが好きです。これは、言及されている他のどのオプションよりも効率的です。

于 2013-03-31T12:56:44.367 に答える
101

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

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

オプション 2 が最も一般的で、最も簡単に使用できます。精度 (私の例では 12、全体で 12 桁を意味します) を、最適な大きさまたは小ささで調整してください。

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

于 2013-03-31T11:18:06.077 に答える