Si el nombre de una persona es Nulo, ¿cómo rompería la base de datos?


55

Estaba leyendo este artículo en la BBC. Cuenta la historia de una persona llamada Jenifer Null y cómo se enfrenta a problemas cotidianos mientras usa bases de datos en línea como reservar boletos de avión, banca en línea, etc.

No conozco bien las bases de datos y no lo uso con mucha frecuencia. Cuando hice un sitio web para aprender, la validación de formularios del lado del servidor usaba expresiones regulares. Por lo que recuerdo, aceptaría felizmente el nombre "Nulo". Aunque no lo he probado.

¿Alguien podría explicar los tecnicismos cuando ocurriría esta situación? ¿La validación del formulario solo está haciendo string == NULLalgo o algo? Aun así no lo pienso NULL is same as "NULL".


32
El artículo fue obviamente escrito por un periodista. Los nulos son la causa de muchas confusiones, no es de esperar que un periodista esté menos confundido.
ypercubeᵀᴹ

2
Todos: los comentarios con enlaces a preguntas o artículos relacionados se han trasladado a una respuesta Wiki de la comunidad a continuación. Edite (o sugiera una edición) a esa respuesta en lugar de agregar más enlaces en esta página.
Paul White

Respuestas:


42

He visto interfaces de bases de datos (por ejemplo, bibliotecas de framework) que devuelven 'nulo' como una cadena para columnas nulas. Creo que había una bandera que activaría o desactivaría esto para la depuración. Este indicador permite a los desarrolladores determinar fácilmente si el campo vacío fue el resultado de un valor nulo o un valor vacío. Esta es una mala configuración, especialmente en producción, y explicaría los problemas explicados en el artículo.

El procesamiento inverso de convertir 'nulo' a un valor nulo debería generar un error de aplicación para un campo de nombre. Esperaría que esto se resuelva bastante rápido.


De hecho, esto es bastante común en los marcos para lenguajes sin tipo donde todos los datos se convierten en una cadena. Han pasado algunos años desde que trabajé en él, pero creo que las primeras versiones de ColdFusion tenían este problema, por ejemplo.
Jules

25

Hay una buena posibilidad de que una buena parte de tu confusión provenga de la del periodista. El artículo habla sobre problemas al usar sistemas de aplicaciones completos, no solo bases de datos. Completamente razonable ya que este es un escrito dirigido al consumo masivo, pero los detalles técnicos son pasados ​​por alto o mal interpretados por el autor.

Es probable que algunos de estos problemas se causen en la capa de aplicación, en lugar de en la API de la base de datos. Los valores mágicos son un antipatrón que es ridículamente difícil de eliminar de la industria. Muy fácilmente, algún programador podría haber escrito una condición similar a "¿alguien escribió 'nulo'? ¡Deben significar que no hay valor, porque eso es lo que significa nulo!" Un intento equivocado de prevenir la inyección de SQL también podría ser responsable del maltrato mencionado de Null, o el apellido hawaiano que contiene una comilla simple, que también es el delimitador de cadena SQL estándar.

Una aplicación que transforma incorrectamente estos valores en NULL o una cadena vacía puede crear errores fácilmente si la lógica de negocios o las restricciones de la base de datos esperan algo diferente. Naturalmente, esto resulta exactamente en la frustrante experiencia del usuario descrita en el artículo.


55
No sabía que O'Brian era hawaiano.
glglgl

19

El artículo en sí incluye un enlace a una pregunta de desbordamiento de pila que demuestra el problema; estaba en una aplicación Flex donde el código:

currentChild.appendChild("Fred");

agregaría un elemento que contiene la palabra Freda un documento XML pero el código:

currentChild.appendChild("null");

agregaría un elemento vacío, no un elemento que contenga el texto "nulo".

XML, per se, no tiene un problema con el valor de texto "NULL", por lo que incluir dicho texto no sería un problema. De hecho, NULLno tiene ningún significado especial en XML.


13

Una cosa que no creo haber visto mencionada: no solo estamos hablando de SQL.

El nombre puede comenzar / finalizar en la base de datos ... pero llegar allí normalmente involucra MÚLTIPLES canales. Base de datos, SQL, php, html, javascript ... Java, C #, VB, Perl, Phython, Ruby, bash, batch, etc., etc., etc.

Cada uno de estos pasos en la tubería podría implicar la conversión de datos de un formato a otro. Desde tablas SQL, a json, a xml, a CSV, etc.

En cualquier punto de esta cadena complicada, solo tomará un lugar de mala programación o un lenguaje de programación difuso ( manejo nulo de JavaScript, por ejemplo) ...

Así que no se limite al problema de estar en la base de datos ... porque puede estar en cualquier parte de la "pila".


8

Community Wiki responde por los diversos enlaces que originalmente se dejaron como comentarios sobre esta pregunta popular


4

Las bases de datos relacionales tienen que acomodar valores perdidos o irrelevantes. Por ejemplo, la lista de clientes puede incluir un número de teléfono móvil o un género. ¿Qué pasa si una corporación quiere convertirse en cliente? ¿Qué género debería tener?

Se utiliza un indicador especial para mostrar que falta un valor. Esta bandera especial es NULL. Por lo tanto, la programación descuidada puede hacer que el indicador de valor faltante, NULL, se confunda con el apellido de Jennifer Null, tal vez interpretando su apellido como datos faltantes en lugar de un valor real.

Es un poco como abrir una cuenta bancaria pero no depositar dinero. El saldo es cero. Esto no significa que no tengas equilibrio. Significa que tiene un saldo y su valor es "0". Pero la programación descuidada podría malinterpretar el cero como un "no existe" y determinar que no tiene una cuenta en absoluto.


2

Hay un montón de software mal escrito, e incluso marcos, que se comportarían de manera extraña con alguien llamado Null.

Pero no olvidemos el elemento humano: ¿quizás los humanos vean el nombre en pantallas e impresiones y piensen que es un error y eliminar a la persona es otra causa probable?

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.