Microsoft peut-il stocker des champs à trois valeurs dans un seul bit?

Je suis complètement ignorant de SQL / bases de données, mais je discutais avec un ami qui fait beaucoup de travail de database sur la façon dont certaines bases utilisent un champ "boolean" qui peut prendre une valeur de NULL en plus de vrai et faux.

A ce propos, il a fait un commentaire de ce genre: "Au crédit de Microsoft, ils n'ont jamais fait reference à ce type de domaine comme un boolean, ils l'appellent juste un peu et c'est un peu vrai – si vous avez huit champs ou less dans un logging, il suffit d'un octet pour les stocker tous. "

Naturellement, cela me semble impossible – si le champ peut contenir trois valeurs, vous n'allez pas en insert huit dans un octet. Mon ami a convenu que cela semblait bizarre, mais a supplié l'ignorance des internes de bas niveau et a dit que pour autant qu'il sache, de tels champs peuvent contenir trois valeurs vues du côté SQL, et cela fonctionne pour exiger un octet de stockage . J'imagine que l'un de nous a un fil croisé. Quelqu'un peut-il expliquer ce qui se passe vraiment ici?

Je recommand de lire ceci pour une bonne explication du stockage nul: Comment SQL Server stocke-t-il vraiment les NULL-s . En bref, le bit null / not null est stocké à un endroit différent, le bitmap nul pour la ligne.

De l'article:

Chaque ligne a un bitmap nul pour les colonnes qui autorisent les valeurs nulles. Si la ligne de cette colonne est nulle alors un bit dans le bitmap est 1 sinon c'est 0.

Ainsi, alors que les valeurs réelles pour les colonnes 8 bits sont stockées dans 1 octet, il y a des bits supplémentaires dans le bitmap null de la ligne qui indiquent si cette colonne est NULL ou non … dépend donc de la façon dont vous countz. Pour être complètement précis, les colonnes de 8 bits utilisent 2 octets , juste divisés en 2 endroits différents.

L'indicateur null est stocké séparément, donc un bit nullable nécessite réellement deux bits. Et à ssortingctement parler, "null" n'est pas une troisième valeur; C'est un espace réservé qui dit: «Il pourrait y avoir une valeur ici, mais nous ne soaps pas ce que c'est. Donc, si un bit est nul, vous pouvez le comparer à true et la comparaison échouera, mais vous pouvez également le comparer à false et la comparaison échouera.

Vous avez raison. Vous pouvez placer les huit valeurs true / false dans un seul octet, mais vous avez toujours besoin d'un stockage supplémentaire pour indiquer s'il est NULL ou non. Représenter 3 8 états différents avec seulement 2 8 est impossible.

Ton ami a raison, mais il a tort en même time. Il est possible qu'un champ BIT soit considéré comme capable de maintenir trois valeurs différentes, mais par définition, NULL est l'absence d'une valeur.

De plus, en autorisant NULL sur les champs de bits, cela signifie que 2 bits seront utilisés pour ce champ (un pour la valeur, et un pour s'il est NULL ou non). Mais l'état NULL du champ (le bit NULL) est stocké dans un bitmap pour la ligne, et non dans l'espace memory exact pour la colonne donnée.

D'autres ont déjà dit que BIT nécessite 2 bits, pas un.

Un autre point important qui est souvent oublié: Bit dans SQL Server n'est pas un type de données boolean ou logique; c'est un type de données numérique (entier). "Un type de données entier qui peut prendre une valeur de 1, 0 ou NULL" . Bit prend en charge uniquement les opérateurs numériques (<,>, +, -). Il ne supporte aucun des opérateurs logiques (AND, OR, NOT, etc).