Diferencia entre vacío y not null

Les escribo porque quiero saber a nivel GENERAL la diferencia entre un campo vacío, y un campo null.

Yo, en cualquier base de datos, puedo dejar un campo vacío sin ingresar datos (sin espacios, letras, números, etc), pero porque si no ingrese nada se considera ese campo vacío y no se lo considera null.

Quiero saber de forma clara la diferencia entre blanco y null porque he buscado en diferentes foros, y no he logrado dar con la diferencia.

En algún foro leí, que en caso que el campo no sea texto, ej,: fechas, no puedo dejar el campo en blanco, pero si lo puedo dejar null, pero igual sigo sin entender la diferencia.

A todos los que me puedan ayudar, desde ya

2 Respuestas

Respuesta
4

En Access y VBA(no en todos los gestores de bases de datos y lenguajes de programación es igual...):

Empty (vacío) es el valor de una variable de tipo Variant mientras no se le asigne un valor.

Null (nulo) es el valor de un campo (de una tabla) mientras no se le asigne un valor.

Con unos ejemplos igual lo ves más claro:

Abre una base de datos access nueva y crea un módulo. Pega este código:

Public Sub Testing()
  Dim var 
  If IsEmpty(var) Then
    Debug.Print "vacía"
  ElseIf IsNull(var) Then
    Debug.Print "nulo"
  Else
    Debug.Print var
  End If
End Sub

Si abres la ventana inmediato (Ctrl+G)  y escribes "Testing" (sin las comillas), al pulsar Intro verás que debajo te pone "vacía", porque has declarado una variable de tipo Variant y no le has dado ningún valor.

Si antes del If añades una nueva linea y escribes: var=null, y vuelves a escribir testing en la ventana inmediato, te aparecerá "nulo", porque a la variable var le has dado un valor nulo.

Si en vez de var=null, pones var=2, o var="hoola", verás que aparecen esos valores "2" o "hoola".

Y si pones var=Empty, volverá a mostrar "vacía".

Ahora vuelve al código del principio y cambia la declaración de la variable, por ejemplo poniendo

Dim var As String

Si ahora haces la prueba verás que no te pone nada debajo de testing, pero no es del todo cierto, lo que ha devuelto es una cadena vacía (""), que es otra cosa diferente a Null y Empty.

Si cambias el tipo de variable, verás que el comportamiento es diferente (devolverá 0 con variables numéricas (Integer, Long...), 0:00:00 si es de tipo Date)

Sigamos haciendo pruebas con una variable String (o de otro tipo menos Variant): añade antes del if las siguientes opciones (una a una) y ejecuta:

Var=Null ---> Te dará un error, porque solo las variables Variant pueden contener un valor Nulo

Var=Empty ---> te devolverá una cadena vacía (si es un String), 0 (si es numérica) o 0:00:00 (si es date), es decir, pasarle un Empty a una variable que no sea Variant, devuelve su valor por defecto

Var=... (aquí pon lo que quieras) ---> devolverá ese valor (salvo que sea incompatible con el tipo de variable declarada, por ejemplo poner un texto en una variable numérica)

Ahora crea en esa BD una tabla (TDatos) con los siguientes campos: ID (Autonumérico), Nombre (Texto), Edad (Número) y FNac (Fecha/Hora) y cierra la tabla sin rellenar ningún campo. En el módulo pega este otro procedimiento:

Public Sub testing2()
Debug. Print DLookup("ID", "TDatos")
Debug. Print DLookup("Nombre", "TDatos")
Debug. Print DLookup("Edad", "TDatos")
Debug. Print DLookup("FNac", "TDatos")
End Sub

Y al ejecutarlo en la ventana inmediato, escribiendo testing2 y pulsar intro, verás que te aparecen 4 lineas que ponen nulo.

Abre la tabla y crea un registro, dejando alguno de los campos "en blanco" (es decir, sin escribir nada en ellos). Si vuelves a ejecutar el procedimiento en la ventana inmediato, verás los valores que has puesto y nulos en los campos que has dejado sin rellenar.

Ahora borra todos los valores de los campos menos el del Id, que no lo puedes borrar, y ejecuta de nuevo: verás que te devuelve un 1 (el del ID) y 3 nulos. Es decir, que en una tabla, un campo que no tenga un valor asignado devuelve un valor Nulo (Null), pero no un valor vacío (Empty)

Te dejo unos enlaces, en ingés, en los que tratan el tema de los nulos, vacíos y cadenas vacías:

https://www.experts-exchange.com/articles/1910/Understanding-Null-Empty-Blank-N-A-ZLS-Nothing-Missing.html 

http://allenbrowne.com/vba-NothingEmpty.html 

Un saludo.


Vaya, vaya, veo que Jacinto se me adelantó mientras desarrollaba los ejemplos y coincidimos en el enlace, je je...

Respuesta
3

Guillermo: Ya que ese tema tiene una explicación un poco extensa te sugiero mires éste enlace que lo explica muy bien.

https://www.experts-exchange.com/articles/1910/Understanding-Null-Empty-Blank-N-A-ZLS-Nothing-Missing.html

Un saludo >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas