Estou interessado principalmente em MySQL e PostgreSQL, mas você pode responder o seguinte em geral:
- Existe um cenário lógico no qual seria útil distinguir uma string vazia de NULL?
Quais seriam as implicações de armazenamento físico para armazenar uma string vazia como...
- NULO?
- Cadeia vazia?
- Outro campo?
- Qualquer outra maneira?
Digamos que o registro venha de um formulário para coletar informações de nome e endereço. A linha 2 do endereço normalmente ficará em branco se o usuário não morar em um apartamento. Uma string vazia neste caso é perfeitamente válida. Eu costumo preferir usar NULL para significar que o valor é desconhecido ou não fornecido.
Não acredito que valha a pena se preocupar com a diferença de armazenamento físico na prática. Como administradores de banco de dados, temos peixes muito maiores para fritar!
Eu não sei sobre MySQL e PostgreSQL, mas deixe-me tratar isso um pouco de forma geral.
Existe um DBMS chamado Oracle que não permite escolher seus usuários entre NULL e ''. Isso demonstra claramente que não é necessário distinguir entre ambos. Existem algumas consequências irritantes:
Você define um varchar2 para uma string vazia como esta:
o seguinte leva ao mesmo resultado
Mas para selecionar as colunas onde o valor está vazio ou NULL, você deve usar
Usando
é sintaticamente correto, mas nunca retorna uma linha.
Por outro lado, ao concatenar strings no Oracle. varchars NULL são tratados como strings vazias.
rende ab . Outros DBMS retornariam NULL nesses casos.
Quando você deseja expressar explicitamente que um valor é atribuído, você deve usar algo como ' '.
E você precisa se preocupar se aparar não resulta em NULL
Sim.
Agora olhando para DBMS onde '' não é idêntico a NULL (por exemplo, SQL-Server)
Trabalhar com '' é geralmente mais fácil e na maioria dos casos não há necessidade prática de distinguir entre ambos. Uma das exceções que conheço é quando sua coluna representa alguma configuração e você não tem padrões vazios para elas. Quando você pode distinguir entre '' e NULL, você pode expressar que sua configuração está vazia e evitar que o padrão se aplique.
Depende do domínio em que você está trabalhando.
NULL
significa ausência de valor (ou seja, não há valor ), enquanto string vazia significa que há um valor de string de comprimento zero.Por exemplo, digamos que você tenha uma tabela para armazenar os dados de uma pessoa e ela contenha uma
Gender
coluna. Você pode salvar os valores como 'Masculino' ou 'Feminino'. Se o usuário puder optar por não fornecer os dados de gênero, você deve salvá-los comoNULL
(ou seja, o usuário não forneceu o valor) e não uma string vazia (já que não há gênero com valor '').Uma coisa que vale a pena ter em mente é que, quando você tem um campo que não é obrigatório, mas quaisquer valores presentes devem ser exclusivos, você precisará armazenar valores vazios como NULL. Caso contrário, você só poderá ter uma tupla com um valor vazio nesse campo.
Existem também algumas diferenças com álgebra relacional e valores NULL: NULL != NULL, por exemplo.
Você também pode considerar a crítica de Date a NULL e os problemas de 3VL em SQL e Teoria Relacional (e a crítica de Rubinson à crítica de Date, Nulls, Three-Valued Logic, and Ambiguity in SQL: Critiquing Date's Critique ).
Ambos são referenciados e discutidos detalhadamente em um thread SO relacionado, Opções para eliminar colunas NULLable de um modelo de banco de dados .
Um novo pensamento, uma grande influência na sua escolha de
NULL
/NOT NULL
é se você estiver usando um framework. Eu uso muito o symfony e o usoNULL
de campos de permissão simplifica parte do código e da verificação de dados ao manipular os dados.Se você não estiver usando uma estrutura ou se estiver usando instruções e processamento sql simples, eu escolheria qualquer opção que você achasse mais simples de acompanhar. Eu geralmente prefiro NULL para que
INSERT
as instruções não sejam tediosas ao esquecer de definir os campos vazios comoNULL
.Tendo que trabalhar com Oracle ( o que não permite diferenciar ) cheguei à seguinte conclusão:
De um ponto de vista lógico, não importa. Eu realmente não consigo pensar em nenhum exemplo convincente em que a diferenciação entre NULL e string de comprimento zero adiciona qualquer valor no DBMS.
Do que segue: Você tem uma
NULL
coluna capaz que não permite zero-len''
ou umaNOT NULL
coluna que permite zero-len. (Ambos não são possíveis no Oracle, como'' === NULL
lá.)Pela minha experiência,
''
faz muito mais sentido ao processar os dados, pois normalmente você gostaria de processar a ausência de uma string como a string vazia: Concatenação, Comparação, etc.Para voltar à minha experiência Oracle: Digamos que você queira gerar uma consulta para uma solicitação de pesquisa. Se você (em não Oracle) usa
''
, pode apenas gerarWHERE columnX = <searchvalue>
e funcionará para pesquisas de igualdade. Se usarNULL
tem que fazerWHERE columnX=<searchvalue> or (columnX is NULL and searchvalue is NULL)
.A segunda lógica, mais complicada, é de fato o que você tem que fazer no Oracle, como NULL e
''
é a mesma coisa lá.Eles também são diferentes do ponto de vista do design:
por exemplo
Parece:
Vamos inserir alguns dados:
Agora vamos tentar com null:
Isso é permitido.
Soooooo: nulls não são strings triviais nem o contrário.
Felicidades
Se falamos de teoria, então as regras de Codd dizem que o RDBMS deve tratar
NULL
os valores de uma maneira especial.Como exatamente isso é usado depende dos arquitetos de banco de dados, dependendo do domínio real - tarefa - projeto - aplicativo - área.
Depende dos significados. Veja este exemplo: sua coluna armazena o que uma pessoa disse em 12 de agosto de 2020 entre 8h e 9h UTC. As chances são de que
Você pode fazer com que seus dados signifiquem o que for mais conveniente para você explorando (ou não) o que é oferecido a você