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 ao usar bancos de dados online como reserva de passagens aéreas, net banking etc.
Não sou muito versado em bancos de dados e não os uso com muita frequência. Quando criei um site para aprendizado, a validação do formulário do lado do servidor usava expressões regulares. Pelo que me lembro, aceitaria alegremente o nome "Null". Eu não tentei embora.
Alguém poderia explicar os detalhes técnicos quando essa situação ocorreria? A validação do formulário está apenas fazendo um string == NULL
ou algo assim? Mesmo assim não acho NULL is same as "NULL"
.
Já vi interfaces de banco de dados (por exemplo, bibliotecas de estrutura) que retornam 'nulo' como uma string para colunas nulas. Acredito que havia um sinalizador 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.
Há uma boa chance de que boa parte da sua confusão venha do jornalista. O artigo fala sobre problemas usando sistemas de aplicativos inteiros, não apenas bancos de dados. Completamente razoável, já que se trata de um texto voltado para o consumo de massa, mas os detalhes técnicos são encobertos ou mal interpretados pelo autor.
Provavelmente, vários desses problemas são causados na camada do aplicativo, e não na API do banco de dados. Os valores mágicos são um antipadrão ridiculamente difícil de eliminar da indústria. Muito facilmente, algum programador poderia ter escrito uma condição do tipo "alguém digitou 'nulo'? Deve significar que não há valor, porque é isso que significa nulo!" Uma tentativa equivocada de impedir a injeção de SQL também pode ser responsável pelo tratamento incorreto mencionado de Null, ou o sobrenome havaiano que contém uma aspa simples, que também é o delimitador de string SQL padrão.
Um aplicativo que transforma incorretamente esses valores em NULL ou em uma string 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.
O próprio artigo inclui um link para uma pergunta do Stack Overflow que demonstra o problema; foi em uma aplicação Flex onde o código:
anexaria um elemento contendo a palavra
Fred
a um documento XML, mas o código:acrescentaria um elemento vazio, não um elemento contendo o texto "nulo".
O XML, por si só, não tem problema com o valor de texto "NULL", então incluir esse texto não seria problema. Na verdade,
NULL
não tem nenhum significado especial em XML.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 MÚLTIPLOS canais. Banco de dados, Sql, php, html, javascript... Java, C#, VB, Perl, Phython, Ruby, bash, batch, etc, etc, etc...
Cada uma dessas etapas no pipeline pode envolver a conversão de dados de um formato para outro. Desde 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 estar no banco de dados... porque pode estar em qualquer lugar da "pilha".
Resposta do Community Wiki para os vários links originalmente deixados como comentários sobre esta pergunta popular
Como um sobrenome Nulo causa problemas em muitos bancos de dados? (Programadores SE)
Falsidades que os programadores acreditam sobre nomes por Patrick McKenzie
Licenciado para Bill por David Mikkelson (snopes.com)
Um exemplo de codificação que causará esse problema na camada de aplicativo.
Exploits of a Mom - também conhecido como Little Bobby Tables (xkcd webcomic)
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 corporação quiser se tornar um cliente - que gênero ela deve ter?
Um indicador especial é usado para mostrar que um valor está faltando. Este sinalizador especial é NULL. Portanto, uma 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 em vez de um valor real.
É um pouco 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. Significa que você tem um saldo e seu valor é "0". Mas uma programação desleixada pode interpretar mal o zero como um "não existe" e determinar que você não tem uma conta.
Há muitos softwares mal escritos, e até estruturas, que se comportariam de maneira estranha com alguém chamado Null.
Mas não vamos esquecer o elemento humano: talvez os humanos vendo o nome nas telas e impressos e pensando que é um erro e deletando a pessoa seja outra causa provável?