SQLServerの「MONEY」データ型が10進浮動小数点であるか2進浮動小数点であるかを拒否または確認するものは見つかりませんでした。
説明では、MONEYタイプの範囲は-2 ^ 63から2 ^ 63 -1であると記載されているため、この種の場合は、バイナリ浮動小数点である必要があります。
しかし このページ では、MONEYが「正確な」数値としてリストされています。 MONEYが10進浮動小数点である可能性があることを示唆するのはどの種類ですか(そうでない場合、それはどのように正確ですか?または正確の定義は何ですか?)
次に、MONEYが10進数の浮動小数点である場合、MONEYとDECIMAL(19,4)の違いは何ですか?
違いを確認するには、ドキュメントを参照してください。
お金 のドキュメント:
Data type Range Storage
money -922,337,203,685,477.5808 to 922,337,203,685,477.5807 8 bytes
smallmoney -214,748.3648 to 214,748.3647 4 bytes
お金と小額のデータ型は、それらが表す通貨単位の1万分の1まで正確です。
10進数 と比較してください:
最大精度を使用する場合、有効な値は-10 ^ 38 +1から10 ^ 38-1までです。
Precision Storage
1 - 9 5 bytes
10 - 19 9 bytes
20 - 28 13 bytes
29 - 38 17 bytes
したがって、それらは完全に同等ではなく、ただ類似しています。 DECIMAL(19,4)の範囲はMONEYよりもわずかに大きくなります(-10 ^ 15 +0.0001から10 ^ 15 --0.0001まで格納できます)が、さらに1バイトのストレージが必要です。
言い換えれば、これは機能します:
CREATE TABLE Table1 (test DECIMAL(19,4) NOT NULL);
INSERT INTO Table1 (test) VALUES
(999999999999999.9999);
SELECT * FROM Table1
999999999999999.9999
しかし、これはしません:
CREATE TABLE Table1 (test MONEY NOT NULL);
INSERT INTO Table1 (test) VALUES
(999999999999999.9999);
SELECT * FROM Table1
Arithmetic overflow error converting numeric to data type money.
セマンティックの違いもあります。金銭的価値を保存したい場合は、moneyタイプを使用するのが理にかなっています。
主な違いは、必要なストレージスペースだと思います。
DECIMAL(19,4)
には9ストレージバイトが必要です
MONEY
には8ストレージバイトが必要です