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つの質問が生じます。
この列を持つテーブルのサイズは列の定義に依存せず、代わりに列内の真の値がテーブルのサイズを定義していますか?
bOLの情報がdatalength()が返すものと一致しないのはなぜですか?
混合しないストレージ(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)