Estoy interesado principalmente en MySQL y PostgreSQL, pero podría responder lo siguiente en general:
- ¿Existe un escenario lógico en el que sería útil distinguir una cadena vacía de NULL?
¿Cuáles serían las implicaciones de almacenamiento físico para almacenar una cadena vacía como ...
- ¿NULO?
- ¿Cuerda vacía?
- Otro campo?
- ¿Cualquier otra manera?
null
feature-comparison
empty-string
Maniero
fuente
fuente
NULL
o noNo sé acerca de MySQL y PostgreSQL, pero déjenme tratar esto un poco en general.
Hay un DBMS, a saber, Oracle, que no permite elegir sus usuarios entre NULL y ''. Esto demuestra claramente que no es necesario distinguir entre ambos. Hay algunas consecuencias molestas:
Establece un varchar2 en una cadena vacía como esta:
lo siguiente lleva al mismo resultado
Pero para seleccionar las columnas donde el valor está vacío o NULL, debe usar
Utilizando
es sintácticamente correcto, pero nunca devuelve una fila.
Por otro lado, al concatenar cadenas en Oracle. Los varchars NULL se tratan como cadenas vacías.
rinde abc . Otros DBMS devolverían NULL en estos casos.
Cuando desee expresar explícitamente que se asigna un valor, debe usar algo como ''.
Y debe preocuparse si el recorte no está vacío da como resultado NULL
Lo hace.
Ahora mirando DBMS donde '' no es idéntico a NULL (por ejemplo, SQL-Server)
Trabajar con '' es generalmente más fácil y, en la mayoría de los casos, no hay necesidad práctica de distinguir entre ambos. Una de las excepciones que conozco es cuando su columna representa alguna configuración y no tiene valores predeterminados vacíos para ellos. Cuando puede distinguir entre '' y NULL, puede expresar que su configuración está vacía y evitar que se aplique el valor predeterminado.
fuente
Depende del dominio en el que esté trabajando.
NULL
significa ausencia de valor (es decir, no hay valor ), mientras que una cadena vacía significa que hay un valor de cadena de longitud cero.Por ejemplo, supongamos que tiene una tabla para almacenar los datos de una persona y que contiene una
Gender
columna. Puede guardar los valores como 'Masculino' o 'Femenino'. Si el usuario puede elegir no proporcionar los datos de género, debe guardarlos comoNULL
(es decir, el usuario no proporcionó el valor) y no una cadena vacía (ya que no hay género con valor '').fuente
Una cosa que vale la pena tener en cuenta es que cuando tiene un campo que no es obligatorio, pero cualquier valor que esté presente debe ser único, deberá almacenar valores vacíos como NULL. De lo contrario, solo podrá tener una tupla con un valor vacío en ese campo.
También hay algunas diferencias con el álgebra relacional y los valores NULL: NULL! = NULL, por ejemplo.
fuente
UNIQUE
restricción. Afortunadamente, a partir de 2008 puede usar un índice filtrado para obtener un comportamiento adecuado.También puede tener en cuenta la crítica de Date de NULL y los problemas de 3VL en SQL y la teoría relacional (y la crítica de Rubinson de la crítica de Date, Nulls, Three-Valued Logic y Ambiguity in SQL: Critiquing Date's Critique ).
Ambos se mencionan y discuten extensamente en un subproceso SO relacionado, Opciones para eliminar columnas NULLable de un modelo DB .
fuente
Un nuevo pensamiento, una gran influencia en su elección de
NULL
/NOT NULL
es si está utilizando un marco. Utilizo mucho Symfony y el uso deNULL
campos de permiso simplifica parte del código y la verificación de datos al manipular los datos.Si no está utilizando un marco o si está utilizando declaraciones y procesamiento simples de SQL, elegiría la opción que considere más fácil de seguir. Generalmente prefiero NULL de manera que haciendo
INSERT
declaraciones no resultar tedioso con el olvido para establecer los campos vacíos aNULL
.fuente
Habiendo tenido que trabajar con Oracle ( que no te permite diferenciar ), he llegado a la siguiente conclusión:
Desde un punto de vista lógico no importa. Realmente no puedo pensar en un ejemplo convincente donde la diferenciación entre NULL y cadena de longitud cero agregue algún valor en el DBMS.
De lo que sigue: Usted tiene una
NULL
columna capaz que no permite cero len''
(solución Oracle-ish) o unaNOT NULL
columna que permite cero len.Y desde mi experiencia,
''
tiene mucho más sentido al procesar los datos, ya que normalmente le gustaría procesar la ausencia de una cadena como la cadena vacía: concatenación, comparación, etc.Nota: Para volver a mi experiencia con Oracle: supongamos que desea generar una consulta para una solicitud de búsqueda. Si lo usa
''
, puede generarWHERE columnX = <searchvalue>
y funcionará para búsquedas de igualdad. Si usasNULL
tienes que hacerWHERE columnX=<searchvalue> or (columnX is NULL and serchvalue is NULL)
. ¡Bah! :-)fuente
También son diferentes desde una perspectiva de diseño:
p.ej
Parece:
Vamos a insertar algunos datos:
Ahora intentemos con nulo:
Esto esta permitido.
Soooooo: los nulos no son cadenas triviales ni al revés.
Salud
fuente
Si hablamos de teoría, entonces las reglas de Codd dicen que RDBMS debe tratar los
NULL
valores de una manera especial.La forma exacta en que se usa depende de los arquitectos de bases de datos, dependiendo del dominio real - tarea - proyecto - aplicación - área.
fuente