Considere as seguintes informações provenientes das páginas de documentos do Microsoft SQL:
O SQL Server Database Engine otimiza o armazenamento de colunas de bits. Se houver 8 ou menos colunas de bits em uma tabela, as colunas serão armazenadas como 1 byte. Se houver colunas de 9 a 16 bits, as colunas serão armazenadas como 2 bytes e assim por diante.
Consulte: https://learn.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-2017
Então, se eu criar uma nova tabela assim:
CREATE TABLE MyTable (
Id int PRIMARY KEY,
Value1 bit,
Value2 bit,
Value3 bit,
Value4 bit,
Value5 bit,
Value6 bit,
Value7 bit,
Value8 bit)
...então todas as colunas de bits (Value1, Value2, ... Value8) em uma linha devem ocupar um byte. Ou?
Quando olhamos mais de perto, o campo Valor1 de uma linha pode ter valores 0, 1 ou NULL dentro. Isso significa que o campo é, na verdade, de um valor de 3 estados ou um valor ternário. 2 desses valores podem representar um dicionário de 3*3=9 valores. 8 desses valores são um dicionário de 6561 valores.
Se estivermos pensando no consumo de memória de tal linha, 8 bits devem ocupar um byte. Isso significa que esse byte codifica 6561 valores em vez de 256 valores. Isso está obviamente errado.
Então, ou os documentos do MS SQL são enganosos ou estamos falando de alguma computação quântica aqui. Claro que é o primeiro, mas o que eu realmente gostaria de saber é a resposta para esta pergunta: como os bits anuláveis (e, claro, os bits do SQL Server são anuláveis por padrão) realmente armazenados nas estruturas subjacentes do SQL Server?