I tried to figure out how SQL Server stores Tinyint
(which is supposed to be 1-byte long) column.
-- Create tableCREATE TABLE MyTest.dbo.TempTable( Col1 Tinyint NOT NULL);-- Fill it upINSERT INTO dbo.TempTable VALUES (3);-- Get page infodbcc ind('MyTest' /*Database Name*/,'dbo.TempTable' /*Table Name*/,-1 /*Display information for all pages of all indenxes*/);-- Get page datadbcc traceon(3604)dbcc page('MyTest' /*Database Name*/,1 /*File ID*/,182 /*Page ID*/,3 /*Output mode: 3 - display page header and row details */)
aqui está o resultado:
execução DBCC concluída. Se o DBCC imprimiu mensagens de erro, contacte o seu administrador de Sistema.
PAGE: (1: 182)………
Slot 0 Deslocamento 0x60 Comprimento de 9
Tipo de Registro = PRIMARY_RECORD Atributos de Registro = NULL_BITMAP Tamanho do Registro = 9
Despejo de Memória @0x000000000545A060
0000000000000000: 10000600 03000100 00†††††††††††††††††………
Slot 0 coluna 1 Offset 0x4 Comprimento 2 Comprimento (físico) 2
Col1 = 3
DBCC execução concluída. Se o DBCC imprimiu mensagens de erro, contacte o seu administrador de Sistema.Interpretação: a linha de dados actual é 10 00 0600 0300 0100 00 como:
10: bits de Estado a
00: Bit de Status B
0600: Posição em que o número de colunas é armazenado
0300: Tinyint de dados
0100: Número da coluna
00: Null bitmap
Total de bytes: 1 + 1 + 2 + 2 + 2 + 1 = 9 bytes
Comparando com ‘Smallint’:
Alterar ‘Col1 de tipo’ a ‘Smallint
‘ (que é de 2 bytes) produzido exatamente o mesmo resultado. O servidor SQL dedica 2 bytes à coluna ‘Tinyint
‘? Por que não distingue entre “Tinyint” e “Smallint” em tamanho de loja?