Leí un artículo en la BBC. Uno de los ejemplos que dijeron fue que las personas con el apellido 'Null' están teniendo problemas para ingresar sus datos en algunos sitios web.
No se da ninguna explicación sobre el error al que se enfrentan.
Pero hasta donde yo sé, la cadena 'Nulo' y el valor Nulo real es completamente diferente (desde el punto de vista de la base de datos).
¿Por qué esto causaría problemas en una base de datos?
Respuestas:
No causa problemas en la base de datos. Causa problemas en las aplicaciones escritas por desarrolladores que no entienden las bases de datos. La raíz del problema es que gran parte del software relacionado con la base de datos muestra un registro NULL como la cadena
NULL
. Cuando una aplicación se basa en la forma de cadena de un registro NULL (probablemente también utilizando operaciones de comparación que no distinguen entre mayúsculas y minúsculas), dicha aplicación considerará que cualquier"null"
cadena es NULL. Por consiguiente, esa aplicación consideraría que un nombre Nulo no existe.La solución es declarar columnas no nulas como
NOT NULL
en la base de datos y no aplicar operaciones de cadena a los registros de la base de datos. La mayoría de los idiomas tienen excelentes API de bases de datos que hacen innecesarias las interfaces de nivel de cadena. Siempre deben preferirse, ya que cometen otros errores, como la inyección de SQL, menos probable.fuente
NOT NULL
causará un conjunto completo de problemas para otras personas. "Algunas personas solo tienen un único nombre, no un nombre y apellido".Para responder a su pregunta específica, hay muchos pasos a lo largo de la cadena de eventos entre un formulario web y la base de datos. Si el apellido
Null
se interpreta erróneamente como unNULL
valor, entonces el sistema puede rechazar un nombre perfectamente válido como no válido. Esto puede suceder en la capa de la base de datos como lo explica amon . Por cierto, si este es el problema específico, entonces la base de datos probablemente también esté abierta a la inyección SQL, también conocida como el ataque Bobby Tables . Otro paso en la cadena que podría estar causando problemas es el proceso de serialización .En general, el artículo trataba sobre un problema mayor. El mundo es un gran lugar desordenado que no siempre se ajusta a nuestras suposiciones. Esto es especialmente evidente cuando intentas internacionalizar tu aplicación. Al final del día, debemos asegurarnos de que nuestras aplicaciones manejen y codifiquen nuestros datos correctamente . Depende de la empresa decidir cuántos recursos dedicamos a respaldar casos extremos cada vez más complicados. Si bien apoyo totalmente ser inclusivo, entenderé si la empresa decide que "el artista conocido formalmente como Príncipe" necesita usar un personaje Unicode para representar su nombre en nuestra base de datos.
fuente
INSERT INTO users (first, last) VALUES($first, $last)
evalúa aINSERT INTO users (first, last) VALUES(Jennifer, Null)
) todos los nombres cuyos nombres no son palabras clave SQL válidas o nombres de columna simplemente arrojarán errores y tampoco tendrán sus registros insertados. La causa debe ser más compleja.Bueno, antes de que se ingrese en la base de datos, es un elemento DOM, luego una variable de JavaScript que se pasa, se valida y se manipula, luego un valor JSON, luego una variable en cualquier biblioteca JSON de back-end que esté usando, luego se pasa una variable, validado y manipulado en su lenguaje de programación de back-end, luego un elemento de algún tipo de DAO, luego parte de una cadena SQL. Luego, para recuperar el valor, lo hace todo a la inversa. Esos son muchos lugares para que los programadores cometan errores, y generalmente muchos de ellos sin el beneficio de la escritura estática.
fuente
Lo más probable es que sea un problema de programación. Si observa esta respuesta aquí sobre cómo se pasan los NULL, podría causar fácilmente un comportamiento no deseado si fuera "Mr. Null".
https://stackoverflow.com/questions/4620391/mysql-and-php-insert-null-rather-than-empty-string
Puede ver que si algún elemento de datos se pasó como NULL, los datos se interpolarían como una base de datos nula en la base de datos.
"NULL"! = Base de datos nula
Algunos casos de uso y comportamientos relacionados ...
Digamos que el apellido se marcó en la base de datos como no nulo, ahora cuando se insertan los datos, se interpretará como NULL y fallará la inserción.
Otro caso es digamos que el apellido era anulable en la base de datos. El Sr. NULL se inserta y se transforma en DBNull.Value, que no es lo mismo que "NULL". Después de la inserción no podemos encontrar al Sr. Null porque su apellido no es "NULL" sino que en realidad es un valor nulo de la base de datos.
Entonces, esos serían 2 casos de problemas. Como señala @Amon, las bases de datos en sí mismas no tienen problemas con los nulos, aunque uno debe entender cómo se manejan los nulos en cada instancia de RDMS, ya que habrá diferencias entre los diferentes proveedores.
fuente
Atribuiría el problema a la programación descuidada y al diseño deficiente de algunas implementaciones de SQL. "Nulo" el nombre siempre debe presentarse e interpretarse con comillas. nulo, el valor de la base de datos, siempre debe presentarse sin comillas; pero al escribir código ad-hoc, es fácil pasar al paradigma de "cualquier cosa servirá" y aceptar cosas que se consideran una cadena en forma sin comillas.
Esto se agrava por el hecho de que otros tipos de datos; los números, por ejemplo, pueden y son aceptados en cualquier forma porque la interpretación es inequívoca.
fuente
Un problema, fundamentalmente, es que el término "nulo" se aplica a dos conceptos diferentes de la base de datos, a veces usando el contexto para distinguirlos:
Si bien el contexto a veces puede ser suficiente para distinguir entre esos conceptos, hay momentos en que realmente no lo hace. Si uno usa un registro para contener una consulta de búsqueda, por ejemplo, debería haber una diferencia entre decir "Quiero a alguien por el nombre de [lo que sea], sin apellido", versus "Quiero a alguien cuyo nombre sea [ lo que sea] pero cuyo apellido es desconocido ". Muchos motores de bases de datos tienen un sesgo hacia un significado u otro, pero no son todos iguales. El código que espera que un motor de base de datos funcione de una manera puede funcionar mal si se ejecuta en un motor diferente que funciona de manera diferente.
fuente
La mayoría de las respuestas existentes se centran en las partes no SQL de una aplicación, pero también puede haber un problema en SQL:
Si se le indica que filtre los registros donde el apellido de un usuario no está disponible, alguien que no entienda muy bien SQL puede escribir un filtro
WHERE u.lastname != 'NULL'
. Debido a la forma en que funciona SQL, aparecerá para verificar siu.lastname IS NOT NULL
: todos losNULL
registros se filtran. Todos los noNULL
registros permanecen.Excepto, por supuesto, los registros donde
u.lastname == 'NULL'
, pero puede que no haya habido ningún registro disponible durante la prueba.Esto se vuelve más probable si el SQL es generado por algún tipo de marco, donde ese marco no expone una forma fácilmente accesible de verificar la no-
NULL
nodad con los parámetros, y alguien nota "oye, si paso la cadenaNULL
, hace exactamente lo que quiero! "fuente