2016-12-18 4 views
3

SQL Serverでは、FLOATまたはREALを使用して、IEEE 754規格で定義されている格納形式がクリアされた浮動小数点値を格納できます。固定小数点値の場合、DECIMALタイプ(同義語はNUMERICです)を使用できます。しかし、私は、SQL Serverが内部で値DECIMALをどのように格納するかについてはあまりよく分かりません。例えば、私はテーブルを定義した場合、次のように行を挿入:SQL Serverはdecimal型の値を内部的にどのように格納しますか?

01 70 E0 00 00 

この六角:SQL Serverの店が数5.7456が、私はこれを得た方法

IF OBJECT_ID('dbo.test_number_types') IS NOT NULL DROP TABLE dbo.test_number_types; 
CREATE TABLE dbo.test_number_types 
(
    id INT IDENTITY(1, 1), 
    c1 NUMERIC(5, 4) 
) 
GO 

INSERT INTO dbo.test_number_types(c1)VALUES(5.7456); 

私はDBCC PAGEコマンドを使用

をチェックします文字列はリトルエンディアンを使用する必要があります。私はSQL Serverが5.7456をどのようにして 01 70 E0 00 00になるのか、それが整数部分のバイト数と小数部分のバイト数を決定する方法を理解できません。誰も助けることができますか?


ところで、「SQL Server 2012内部」という本を確認しました。データ型の保存専用の章があります。しかし、DECIMALタイプのストレージは本に記載されていないようです。

+0

ヒント:BCD、2進化10進数(https://でアン。 wikipedia.org/wiki/Binary-coded_decimal)。私はこれがSQL Serverが実際に値を格納する方法であるとは信じられませんが、他の言語で固定小数点値を格納するための非常に典型的な方法です。 –

+0

ゴードンさんにリンクありがとうございました。私は見てみましょう。 –

+0

@ GordonLinoff私は試みたが、BCDエンコーディングではないようだ。 –

答えて

5

マーティンのスミスコメントはあなたにヒントを与えます。 SQL ServerはBCDを使用しません。 小数点なしでデータを整数で格納します(これは、小数点以下の桁数が列のメタデータに格納されるためです)。従って5.745657456、または0xE070として格納されます。 SQLの悪名高いバイトスワッピング後、これは70 E0 00 00に変換されます。

先頭は01です。 01は正の数に使用されます。ネガティブの場合は00

(?しかし、私は尋ねなければなりません - なぜあなたはこれを必要としない一般的な使用では、あなたはSQL Serverの内部を気にする必要はありません)

+0

ありがとうもう一度ヒューゴ!私はこれが "SQL Server 2012 Internals"という本を読んでいることを知りたいのですが、DECIMAL型は言及されていません。単なる好奇心から。 –

関連する問題