vez variable una transact saber por igual devolver convertir como cambiar database null

database - transact - saber si una variable es null en sql server



¿Cómo se almacenan los NULL en una base de datos? (5)

Tengo curiosidad por saber 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 para un valor NULL.

¿Podrías 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 metadatos en algún lugar para indicar que este campo es NULO?

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 ...


El servidor generalmente usa metainformación en lugar de un valor mágico. Así que hay un poco fuera de lugar que especifica si el campo es nulo.

-Adán


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


MySql usa 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.


IBM Informix Dynamic Server utiliza valores especiales para indicar 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.

Entonces, como se señaló, los mecanismos difieren según el SGBD.


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

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

;-)