web-dev-qa-db-ja.com

価格の値を保存するのに最適なSQL Serverのフィールドタイプはどれですか。

ショップのような構造のSQL Serverの価格フィールドに最適なタイプは何ですか?

この概要 を見ると、moneysmallmoney、次にdecimal/numeric、最後にfloatおよびreal

名前、メモリ/ディスク使用量、値の範囲:

  • Money:8バイト(値:-922,337,203,685,477.5808から+922,337,203,685,477.5807)
  • Smallmoney:4バイト(値:-214,748.3648〜+214,748.3647)
  • 10進数:9 [デフォルト、最小5]バイト(値:-10 ^ 38 +1〜10 ^ 38 -1)
  • Float:8バイト(値:-1.79E + 308から1.79E + 308)
  • 実数:4バイト(値:-3.40E + 38から3.40E + 38)

これらのタイプで価格値を保存することは本当に賢明ですか?たとえば、 INT?

  • Int:4バイト(値:-2,147,483,648から2,147,483,647)

ショップがドルを使用しているとしましょう。彼らはセントを持っていますが、価格が49.2142342ドルではないので、セントを示す多くの小数を使用すると、SQL帯域幅の浪費のようです。第二に、ほとんどの店は200.000.000に近い価格を表示しません(誰かが私にパリの有名なタワーを売ろうとしない限り、少なくとも通常のウェブショップではそうではありません)。

では、なぜintに行きませんか?

Intは高速で、4バイトしかないため、ドルではなくセントで値を保存し、値を提示するときに除算することで、簡単に小数を作成できます。

もう1つの方法は、4バイトのsmallmoneyを使用することですが、これには計算を実行するためにCPUの計算部分が必要になります。ここで、Intは整数の累乗なので、マイナス面ではすべての結果を分割する必要があります。

Smallmoney/moneyフィールドを使用する場合、地域設定に「通貨」関連の問題はありますか?これらはC#/。NETでも何を転送しますか?

長所/短所はありますか?整数値かsmallmoneyか他の何かを求めますか?

あなたの経験は何を伝えていますか?

29
BerggreenDK

数値が常にsmallmoneyの範囲内に収まると確信している場合は、それを使用すると、数バイトを節約できます。それ以外の場合は、moneyを使用します。しかし、最近のストレージは安価です。 1億レコードを超える追加の4バイトは、まだ半分GB未満です。ただし、@ marc_sが指摘するように、SQLサーバーのメモリフットプリントを削減できる場合は、smallmoneyを使用します。

簡単に言えば、smallmoneyでうまくいけるなら、そうしてください。 mightが上限を超えると思われる場合は、moneyを使用してください。

しかし、notを使用すると、浮動小数点型が使用されます。そうしないと、丸めの問題が発生し、適切に処理しないと、ランダムなセントを失ったり獲得したりします。

intの使用に反対する私の議論:intを格納し、100(10000)で除算して値を取得し、値を格納するときに乗算することを忘れないようにして、ホイールを再発明する理由。私の理解では、お金のタイプはとにかく基礎となるストレージタイプとしてintまたはlongを使用しています。

.NETの対応するデータ型に関しては、decimalになります(これにより、C#コードの丸めの問題も回避されます)。

21
lc.

お金を保管している場合は Money データ型を使用します(国債のような莫大な金額をモデル化しない限り)-精度/丸めの問題を回避します。

お金の多くの利点…データ型!

9
Mitch Wheat

NUMERIC/DECIMALを使用します。 MONEY/SMALLMONEYは避けてください。 これが理由の例です 。遅かれ早かれ、MONEY/SMALLMONEYタイプは、丸めエラーのためにダウンさせる可能性があります。通貨の種類は完全に冗長であり、有用なものは何もありません。通貨の金額は他の10進数と同じです。

最後に、MONEY/SMALLMONEYタイプはMicrosoft独自のものです。 NUMERIC/DECIMALは、SQL標準の一部です。それらはより多くの人々に使用、認識、理解され、ほとんどのDBMSやその他のソフトウェアでサポートされています。

7
nvogel

個人的に、私は店の価格を保存するために小さなお金またはお金を使います。

Intを使用すると、他の場所で複雑さが増します。

また、韓国ウォンまたはインドネシアルピーでも2億ドルは完全に有効な価格です...

4
gbn

SQLデータ型moneyおよびsmallmoneyはどちらもc#decimalタイプに解決されます。

http://msdn.Microsoft.com/en-us/library/system.data.sqltypes.sqlmoney(v = VS.71).aspx

だからあなたはdecimalに行くのも良いだろうと思っています。個人的に私はdoubleを金融業界で働いているすべての人生で使用しており、パフォーマンスの問題などを経験していません。実際、特定の計算などで、より大きなデータ型を使用すると、精度を高めるため。

3
code4life

Moneyデータ型を使用します。個別にSmallmoneyの値を超えることはできませんが、複数のアイテムがそれを超えるのは簡単です。

1
Craig T

私の質屋アプリでは、質屋のオペレーターが$ 5.00から$ 10,000.00を貸し出します。ローンの金額を計算するとき、セントとの取引を避けるために、金額を最も近いドルに丸めます(利息の支払いにも同じことが当てはまります)。ローンの金額が$ 50.00を超えると、ドルの請求額を最小限に抑えるために、最も近い$ 5.00(つまり、$ 50、$ 55、$ 60 ...)に丸められます。したがって、transaction.calculated_loan_amountにはDECIMAL(7,2)を使用し、transaction.loan_amountにはDECIMAL(5,0)を使用します。アプリはペニーへのローン金額を計算し、その金額をloan_amountに入れます。$ 50未満の場合は最も近いドルに、それより大きい場合は最も近い$ 5.00に丸められます。

0
Frank R.