2010-06-02 13 views
17

Soy completamente ignorante de SQL/bases de datos, pero estaba chateando con un amigo que hace un montón de trabajo de base de datos sobre cómo algunas bases de datos usan un campo "booleano" que puede tomar un valor de NULL además de verdadero y falso.¿Puede Microsoft almacenar campos de tres valores en un solo bit?

Con respecto a esto, hizo un comentario como el siguiente: "Para crédito de Microsoft, nunca se han referido a ese tipo de campo como booleano, solo lo llaman un poco. Y es cierto, si tiene ocho o menos campos de bits en un registro, solo requiere un byte para almacenarlos todos ".

Naturalmente, eso me parece imposible: si el campo puede contener tres valores, no va a encajar ocho de ellos en un byte. Mi amigo estuvo de acuerdo en que parecía extraño, pero suplicó ignorancia de las partes internas de bajo nivel y dijo que, por lo que él sabía, tales campos pueden contener tres valores cuando se los mira desde SQL, y funciona para requerir un byte de almacenamiento. . Me imagino que uno de nosotros tiene un cable cruzado. ¿Alguien puede explicar lo que está pasando realmente aquí?

+16

Jon Skeet puede almacenar campos de tres valores en un solo bit. –

+0

@codeka hahahahahaha –

+1

Gaahhhhh ¡Debería haberlo visto venir! – fenomas

Respuesta

19

Recomiendo leer esto para una buena explicación de almacenamiento nulo: How does SQL Server really store NULL-s. En resumen, el bit nulo/no nulo se almacena en un lugar diferente, el mapa de bits nulo para la fila.

Desde el artículo:

Cada fila tiene un mapa de bits nulos para las columnas que permiten valores nulos. Si la fila de esa columna es nulo entonces un poco en el mapa de bits es 1 cosa es 0.

Así, mientras que los valores reales de 8 columnas de bits se almacenan en 1 byte, existen bits adicionales en la fila de null mapa de bits que indica si esa columna es NULL o no ... así que depende de cómo se está contando. Para ser completamente precisa, las columnas de 8 bits usan 2 bytes, simplemente divida en 2 ubicaciones diferentes.

+0

Ah, pensé que debía ser algo como esto. Gracias por el enlace a los detalles sangrientos! – fenomas

+0

su aumento de reputación debe tener uno de los mayores aumentos de cualquier persona en SO. ¡Estaba intrigado por la pendiente de tu gráfico de rep! –

+0

@Mitch - Jaja No lo he comprobado en algún momento que es genial, gracias por señalarlo :) –

7

El indicador nulo se almacena por separado, por lo que un bit que admite nulos requiere en realidad dos bits. Y estrictamente hablando, "nulo" no es un tercer valor; es una especie de marcador de posición que dice: "Podría haber un valor aquí, pero no sabemos qué es". Entonces, si un bit es nulo, puede compararlo con verdadero y la comparación fallará, pero también puede compararlo con falso y la comparación fallará.

3

Estás en la correcta. Puede empaquetar los ocho valores verdaderos/falsos en un solo byte, pero aún necesita almacenamiento adicional para indicar si es NULO o no. Representando 3 estados diferentes con solo 2 es imposible.

2

Tu amigo tiene razón, pero está equivocado al mismo tiempo. Es posible que un campo BIT se considere capaz de mantener tres valores diferentes, pero por definición NULL es la ausencia de un valor.

Además, al permitir NULL en los campos de bits, significa que se usarán 2 bits para ese campo (uno para el valor, y uno para si es NULO o no). Pero el estado NULL del campo (el bit NULL) se almacena en un mapa de bits para la fila, y no en el espacio de memoria exacto para la columna dada.

1

Otros ya han dicho que BIT requiere 2 bits, no uno.

Otro punto importante que a menudo se olvida: Bit en SQL Server no es un tipo de datos lógico o booleano; es un tipo de datos numérico (entero). "An integer data type that can take a value of 1, 0, or NULL". El bit solo admite operadores numéricos (<,>, +, -).No es compatible con ninguno de los operadores lógicos (Y, O, NO, etc.).

Cuestiones relacionadas