Sé que este tema es un poco controvertido y hay muchos artículos / opiniones que flotan en Internet. Desafortunadamente, la mayoría de ellos asume que la persona no sabe cuál es la diferencia entre una cadena NULL y vacía. Entonces cuentan historias sobre resultados sorprendentes con combinaciones / agregados y generalmente hacen lecciones de SQL un poco más avanzadas. Al hacer esto, se pierden absolutamente todo el punto y, por lo tanto, son inútiles para mí. Así que espero que esta pregunta y todas las respuestas avancen un poco hacia adelante.
Supongamos que tengo una tabla con información personal (nombre, nacimiento, etc.) donde una de las columnas es una dirección de correo electrónico con tipo varchar. Suponemos que, por alguna razón, algunas personas pueden no querer proporcionar una dirección de correo electrónico. Al insertar dichos datos (sin correo electrónico) en la tabla, hay dos opciones disponibles: establecer la celda en NULL o establecerla en una cadena vacía (''). Supongamos que conozco todas las implicaciones técnicas de elegir una solución sobre otra y puedo crear consultas SQL correctas para cualquier escenario. El problema es que incluso cuando ambos valores difieren en el nivel técnico, son exactamente iguales en el nivel lógico. Después de mirar NULL y '' llegué a una sola conclusión: no sé la dirección de correo electrónico del chico. Además, no importa cuánto lo intente, No pude enviar un correo electrónico usando NULL o una cadena vacía, por lo que aparentemente la mayoría de los servidores SMTP están de acuerdo con mi lógica. Así que tiendo a usar NULL donde no sé el valor y considero que la cadena vacía es algo malo.
Después de algunas discusiones intensas con colegas, llegué con dos preguntas:
¿estoy en lo cierto al suponer que el uso de una cadena vacía para un valor desconocido está causando que una base de datos "mienta" sobre los hechos? Para ser más precisos: usando la idea de SQL de lo que es valor y lo que no lo es, podría llegar a una conclusión: tenemos una dirección de correo electrónico, solo al descubrir que no es nula. Pero luego, cuando intente enviar un correo electrónico, llegaré a una conclusión contradictoria: no, no tenemos una dirección de correo electrónico, ¡esa base de datos @! # $ Debe haber estado mintiendo!
¿Hay algún escenario lógico en el que una cadena vacía '' podría ser un buen portador de información importante (además del valor y ningún valor), que sería problemático / ineficiente para almacenar de cualquier otra manera (como una columna adicional). He visto muchas publicaciones que afirman que a veces es bueno usar una cadena vacía junto con valores reales y NULL, pero hasta ahora no he visto un escenario que sea lógico (en términos de diseño de SQL / DB).
PD: Algunas personas se verán tentadas a responder que es solo una cuestión de gusto personal. No estoy de acuerdo Para mí es una decisión de diseño con importantes consecuencias. Así que me gustaría ver respuestas donde la opinión sobre esto está respaldada por algunas razones lógicas y / o técnicas.
''
incluso en Oracle, no es lo mismo que NULL
. Por ejemplo, asignarle una CHAR(1)
columna al valor ''
dará como resultado ' '
(es decir, un espacio), no NULL
. Además, si Jacek usara Oracle, esta pregunta probablemente ni siquiera surgiría :-)
'' IS NULL
evalúa true
en PL / SQL.