web-dev-qa-db-ja.com

データ型が10進数の列サイズ

SQL Server 2008 R2のBOLによると、decimalデータ型には次のストレージバイトが必要です。

Precision  Storage bytes

1 - 9      =>   5

10-19      => 9

20-28      => 13

29-38      => 17

しかし、decimal(19,5)でフォーマットされ、値が10999.99999の列でdatalength()を実行すると、5バイトが返されますか?これは、私の理解では9の精度ではなく10の精度であり、9バイトになるはずです。

これにより、2つの質問が生じます。

  1. この列を持つテーブルのサイズは列の定義に依存せず、代わりに列内の真の値がテーブルのサイズを定義していますか?

  2. bOLの情報がdatalength()が返すものと一致しないのはなぜですか?

7
nojetlag

混合しないストレージ(5または9バイト)と返されるもの

Decimal(19,5)列では、ディスク上ではalways 9バイトです。そのため、ゼロは9バイトになります。

きみの 10999.99999は、格納された数値の単なる表現であり、DATALENGTHによって10999.99999として解析されます。

編集:

DATALENGTHは、指定された式を格納するために必要なバイト数を返します。 ignoresデータ型がほとんどです。そう 10999.99999はdecimal(10,5)として扱われ、Martinがコメントで指摘したように、canは9ではなく5バイトで格納されます。

したがって、decimal(19,5)列は常に9バイトです。 DATALENGTHは関係ありません。式10999.99999および5バイトに格納できると判断します。しかしもちろんできません

個人的には、末尾のスペースなどを見つける以外にDATALENGTHを使用したことはありません。

基本的に、文字列以外のデータ型では [〜#〜] datalength [〜#〜] を使用しないでください。

式を表すために使用されるバイト数を返します。

DATALENGTHは、可変長データを格納できるため、varchar、varbinary、text、image、nvarchar、およびntextデータ型で特に役立ちます。

注:LENは、文字列表現の長さを示します

DECLARE @i decimal(19,5)
SET @i ='10999.99999'
SELECT @i,LEN(@i),DATALENGTH(@i)
SET @i ='-90999.99999'
SELECT @i,LEN(@i),DATALENGTH(@i)
6
gbn