我试图弄清楚SQL Server如何存储Tinyint
(应该是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打印了错误消息,请与系统管理员联系。
PAGE:(1:182) ... ... ...
Slot 0 Offset 0x60 Length 9
记录类型= PRIMARY_RECORD记录属性= NULL_BITMAP 记录大小= 9
内存转储@ 0x000000000545A060
<00> 0000000000000000: 10000600 03000100 00 †††††††††.........插槽0列1偏移0x4长度2长度(物理)2
Col1 = 3
DBCC执行完成。如果DBCC打印了错误消息,请与系统管理员联系。
<小时/> 的解释 实际数据行为10 00 0600 0300 0100 00,如下:
Smallint
&#39; (长度为2个字节)产生完全相同的结果。 Tinyint
&#39;柱?为什么它没有区分&#39; Tinyint&#39;和&#39; Smallint&#39;在商店大小?
答案 0 :(得分:1)
尝试查看DBCC PAGE WITH TABLERESULTS的输出。
当我输入两行时,一行全0,一行全1,我可以清楚地看到tinyint字段只使用一个字节:
CREATE TABLE dbo.SpaceTest
(
biggest BIGINT ,
medium INT ,
small SMALLINT ,
tiny TINYINT
)
INSERT INTO dbo.SpaceTest
( biggest, medium, small, tiny )
VALUES ( 0, 0, 0, 0 ),
( 1, 1, 1, 1 )
--Get a list of pages used by the table
DBCC IND('Sandbox', 'SpaceTest',0)
DBCC TRACEON (3604);
DBCC PAGE (Sandbox,1,42823,3) WITH tableresults;
GO