Tinyint
SQL Server が(1 バイト長であると想定されている) 列をどのように格納するかを理解しようとしました。
-- Create table
CREATE TABLE MyTest.dbo.TempTable
(
Col1 Tinyint NOT NULL
);
-- Fill it up
INSERT INTO dbo.TempTable VALUES (3);
-- Get page info
dbcc ind
(
'MyTest' /*Database Name*/
,'dbo.TempTable' /*Table Name*/
,-1 /*Display information for all pages of all indenxes*/
);
-- Get page data
dbcc traceon(3604)
dbcc page
(
'MyTest' /*Database Name*/
,1 /*File ID*/
,182 /*Page ID*/
,3 /*Output mode: 3 - display page header and row details */
)
結果は次のとおりです。
DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に連絡してください。
ページ: (1:182) ... ... ...
スロット 0 オフセット 0x60長さ 9
レコード タイプ = PRIMARY_RECORD レコード属性 = NULL_BITMAPレコード サイズ = 9
メモリダンプ @0x000000000545A060
0000000000000000: 10000600 03000100 00 ††††††††††††††††††…………
スロット 0 列 1 オフセット 0x4 長さ 2 長さ (物理) 2
列 1 = 3
DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に連絡してください。
解釈: 実際のデータ行は 10 00 0600 0300 0100 00 です:
10: ステータス ビット A
00: ステータス ビット B
0600: 列数が格納される位置
0300: Tinyint データ
0100: 列数
00: Null ビットマップ
総バイト数: 1 + 1 + 2 + 2 + 2 + 1 = 9 バイト
'Smallint' との比較:
'Col1' 型を '
Smallint
' (2 バイト長)に変更すると、まったく同じ結果が得られました。質問
Tinyint
SQL Server が ' ' 列
に 2 バイトを割り当てるのはなぜですか? ストア サイズで「Tinyint」と「Smallint」を区別しないのはなぜですか?