Sei que esse assunto é um pouco polêmico e há muitos artigos / opiniões circulando pela Internet. Infelizmente, a maioria deles assume que a pessoa não sabe qual é a diferença entre NULL e string vazia. Eles contam histórias sobre resultados surpreendentes com junções / agregados e geralmente fazem lições de SQL um pouco mais avançadas. Ao fazer isso, eles perdem completamente o objetivo e são, portanto, inúteis para mim. Portanto, espero que esta pergunta e todas as respostas avancem um pouco no assunto.
Suponhamos que eu tenha uma tabela com informações pessoais (nome, nascimento etc.) em que uma das colunas seja um endereço de email com o tipo varchar. Assumimos que, por algum motivo, algumas pessoas podem não querer fornecer um endereço de email. Ao inserir esses dados (sem email) na tabela, há duas opções disponíveis: defina a célula como NULL ou defina a string vazia (''). Vamos supor que estou ciente de todas as implicações técnicas da escolha de uma solução em detrimento de outra e posso criar consultas SQL corretas para qualquer um dos cenários. O problema é mesmo quando ambos os valores diferem no nível técnico, eles são exatamente os mesmos no nível lógico. Depois de olhar para NULL e '', cheguei a uma única conclusão: não sei o endereço de e-mail do cara. Também não importa o quanto eu tentei, Não consegui enviar um email usando uma seqüência de caracteres nula ou vazia, portanto, aparentemente, a maioria dos servidores SMTP por aí concorda com minha lógica. Então, eu costumo usar NULL onde não sei o valor e considero uma string vazia uma coisa ruim.
Após discussões intensas com os colegas, vim com duas perguntas:
Estou certo ao supor que o uso de uma string vazia para um valor desconhecido está causando um banco de dados "mentir" sobre os fatos? Para ser mais preciso: usando a idéia do SQL de o que é valor e o que não é, posso concluir: temos um endereço de email, apenas descobrindo que não é nulo. Porém, mais tarde, ao tentar enviar um e-mail, chegarei a uma conclusão contraditória: não, não temos endereço de e-mail, esse banco de dados @! # $ Deve estar mentindo!
Existe algum cenário lógico no qual uma string vazia '' possa ser uma transportadora tão boa de informações importantes (além de valor e sem valor), que seria problemático / ineficiente para armazenar de qualquer outra maneira (como coluna adicional). Eu já vi muitas postagens alegando que, às vezes, é bom usar uma string vazia junto com valores reais e NULLs, mas até agora não vi um cenário que fosse lógico (em termos de design do SQL / DB).
PS Algumas pessoas ficam tentadas a responder, que é apenas uma questão de gosto pessoal. Eu não concordo Para mim, é uma decisão de design com consequências importantes. Então, eu gostaria de ver respostas em que a opinião sobre isso é apoiada por alguns motivos lógicos e / ou técnicos.
''
mesmo no Oracle, não é o mesmo que NULL
. Por exemplo, ao atribuir uma CHAR(1)
coluna, o valor ''
resultará em ' '
(ou seja, um espaço), não NULL
. Além disso, se Jacek estava usando Oracle, esta questão provavelmente não até mesmo chegar :-)
'' IS NULL
avaliado true
em PL / SQL.