Se o nome de uma pessoa for Nulo, como isso quebraria o banco de dados?


55

Eu estava lendo este artigo na BBC. Ele conta a história de uma pessoa chamada Jenifer Null e como ela enfrenta problemas do dia-a-dia enquanto usa bancos de dados on-line, como reservas de passagens aéreas, serviços bancários líquidos etc.

Não sou versado em bancos de dados e não o uso com muita frequência. Quando criei um site para aprendizado, a validação do formulário no lado do servidor usava expressões regulares. Pelo que me lembro, seria feliz em aceitar o nome "Nulo". Eu ainda não tentei.

Alguém poderia explicar os detalhes técnicos quando essa situação ocorreria? A validação de formulário está apenas fazendo um string == NULLou algo assim? Mesmo assim eu não acho NULL is same as "NULL".


32
O artigo foi obviamente escrito por um jornalista. Nulos são a causa de muitas confusões, você não esperaria que um jornalista estivesse menos confuso.
usar o seguinte comando

2
Todos: comentários com links para perguntas ou artigos relacionados foram movidos para uma resposta do Wiki da comunidade abaixo. Edite (ou sugira uma edição) para essa resposta em vez de adicionar mais links nesta página.
Paul White

Respostas:


42

Eu vi interfaces de banco de dados (por exemplo, bibliotecas de estrutura) que retornam 'null' como uma string para colunas nulas. Acredito que havia uma bandeira que ativaria ou desativaria isso para depuração. Esse sinalizador permite que os desenvolvedores determinem facilmente se o campo vazio foi resultado de um valor nulo ou vazio. Essa é uma configuração ruim, especialmente na produção, e explicaria os problemas explicados no artigo.

O processamento reverso da conversão de 'nulo' em um valor nulo deve gerar um erro de aplicativo para um campo de nome. Eu esperaria que isso fosse resolvido rapidamente.


De fato - isso é bastante comum nas estruturas para linguagens não tipadas, onde todos os dados são convertidos em uma string. Faz alguns anos que eu trabalhei nele, mas acredito que as primeiras versões do ColdFusion tinham esse problema, por exemplo.
Jules

25

Há uma boa chance de que boa parte da sua confusão se origine da do jornalista. O artigo fala sobre problemas usando sistemas de aplicativos inteiros, não apenas bancos de dados. Completamente razoável, uma vez que se trata de um artigo que visa o consumo em massa, mas os detalhes técnicos são encobertos ou mal interpretados pelo autor.

É provável que vários desses problemas sejam causados ​​na camada do aplicativo, e não na API do banco de dados. Os valores mágicos são um antipadrão que é ridiculamente difícil de eliminar da indústria. Muito facilmente, algum programador poderia ter escrito uma condição na mesma linha de "alguém digitado 'nulo'? Eles devem significar que não há valor, porque é isso que nulo significa!" Uma tentativa equivocada de impedir a injeção de SQL também pode ser responsável pelos maus-tratos mencionados a Null ou o sobrenome havaiano que contém uma aspas simples, que também é o delimitador de string SQL padrão.

Um aplicativo que transforma esses valores incorretamente em NULL ou em uma sequência vazia pode facilmente criar erros se a lógica de negócios ou as restrições de banco de dados esperarem algo diferente. Isso naturalmente resulta exatamente na frustrante experiência do usuário descrita no artigo.


5
Eu não sabia que O'Brian era havaiano.
glglgl

19

O artigo em si inclui um link para uma pergunta de estouro de pilha que demonstra o problema; estava em um aplicativo Flex em que o código:

currentChild.appendChild("Fred");

anexaria um elemento contendo a palavra Freda um documento XML, mas o código:

currentChild.appendChild("null");

acrescentaria um elemento vazio, não um elemento contendo o texto "null".

O XML, por si só, não possui um problema com o valor do texto "NULL", portanto, incluir esse texto não seria um problema. De fato, NULLnão tem nenhum significado especial em XML.


13

Uma coisa que acho que não vi mencionada: não estamos falando apenas de SQL.

O nome pode começar / terminar no banco de dados ... mas chegar lá normalmente envolve vários canais. Banco de dados, Sql, php, html, javascript ... Java, C #, VB, Perl, Phython, Ruby, bash, lote, etc, etc, etc ...

Cada uma dessas etapas no pipeline pode envolver a conversão de dados de um formato para outro. De tabelas SQL, a json, a xml, a CSV, etc ...

Em qualquer ponto dessa cadeia complicada, será necessário apenas um ponto de programação ruim ou uma linguagem de programação difusa ( manipulação nula de Javascript, por exemplo) ...

Portanto, não se limite ao problema de estar no banco de dados ... porque ele pode estar em qualquer lugar da "pilha".



4

Os bancos de dados relacionais precisam acomodar valores ausentes ou irrelevantes. Por exemplo, a lista de clientes pode incluir um número de telefone celular ou um sexo. E se uma empresa quiser se tornar um cliente - que gênero deve ter?

Um indicador especial é usado para mostrar que um valor está ausente. Este sinalizador especial é NULL. Portanto, a programação desleixada pode fazer com que o indicador de valor ausente - NULL - seja confundido com o sobrenome de Jennifer Null, talvez interpretando seu sobrenome como dados ausentes, e não como um valor real.

É como abrir uma conta bancária, mas não depositar dinheiro. O saldo é zero. Isso não significa que você não tem equilíbrio. Isso significa que você tem um saldo e seu valor é "0". Mas a programação desleixada pode interpretar mal o zero como "não existe" e determinar que você não tem uma conta.


2

Há muitos softwares mal escritos e estruturas pares que se comportariam estranhamente com alguém chamado Null.

Mas não vamos esquecer o elemento humano: talvez os humanos vendo o nome nas telas e nas impressões e achando que é um erro e excluindo a pessoa sejam outra causa provável?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.