2008-10-31 7 views
8

Tengo curiosidad por saber cómo se almacenan los NULL en una base de datos?¿Cómo se almacenan los NULL en una base de datos?

Seguramente depende del servidor de la base de datos, pero me gustaría tener una idea general al respecto.


primer intento:

Supongamos que el servidor pone un valor indefinido (podría ser cualquier cosa) en el campo por un valor NULL.

Podría ser muy afortunado y recuperar el valor NULL con

...WHERE field = 'the undefined value (remember, could be anything...)' 

Segundo intento:

¿El servidor tiene una bandera o cualquier meta-datos en alguna parte para indicar este campo es NULL ?

Luego, el servidor debe leer estos metadatos para verificar el campo.

Si los metadatos indican un valor NULL y si la consulta no tiene el "campo IS NULL", , se ignorará el registro.


Parece demasiado fácil ...

+1

El servidor tiene un indicador de algún tipo, y el servidor lee los metadatos para verificar el campo. El hecho de que el valor sea NULO no significa que se ignore el registro, por muchas, muchas razones (generalmente complejas). –

Respuesta

1

En PostgreSQL, utiliza un mapa de bits opcional con un bit por columna (0 es nulo, 1 no es nulo). Si el mapa de bits no está presente, todas las columnas no son nulas.

Esto está completamente separado del almacenamiento de los datos en sí, pero está en la misma página que la fila (por lo que tanto la fila como el mapa de bits se leen juntos).

Referencias:

2

El servidor normalmente utiliza la información de metadatos en lugar de un valor mágico. Así que hay un poco fuera de lugar que especifica si el campo es nulo.

-Adam

9

MySql utiliza el segundo método. Almacena una matriz de bits (uno por columna) con los datos de cada fila para indicar qué columnas son nulas y luego deja en blanco los datos para ese campo. Estoy bastante seguro de que esto es cierto para todas las demás bases de datos también.

El problema con el primer método es, ¿está seguro de que el valor que seleccione para sus datos no aparecerá como datos válidos? Para algunos valores (como fechas o números de coma flotante) esto es cierto. Para otros (como enteros) esto es falso.

1

IBM Informix Dynamic Server utiliza los valores especiales para indicar los valores nulos. Por ejemplo, el rango válido de valores para SMALLINT (16 bits, firmado) es -32767 .. + 32767. El otro valor, -32768, está reservado para indicar NULL. Del mismo modo para INTEGER (4 bytes, firmado) y BIGINT (8 bytes, firmado). Para otros tipos, utiliza otras representaciones especiales (por ejemplo, todos los bits 1 para SQL FLOAT y SMALLFLOAT, también conocido como C double y float, respectivamente). Esto significa que no tiene que usar espacio extra.

IBM DB2 para Linux, Unix, Windows usa bytes adicionales para almacenar los indicadores nulos; AFAIK, usa un byte separado para cada campo anulable, pero podría estar equivocado en ese detalle.

Por lo tanto, como se señaló, los mecanismos difieren según el DBMS.

1

El problema con valores especiales para indicar NULL es que tarde o temprano se insertará ese valor especial. Por ejemplo, se puede insertar en una tabla especificando los indicadores NULL especiales para diferentes servidores de bases

| DBServer  | SpecialValue | 
+--------------+--------------+ 
| 'Oracle'  | 'Glyph'  | 
| 'SQL Server' | 'Redmond' | 

;-)

Cuestiones relacionadas