Estou interessado principalmente no 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 do armazenamento físico para armazenar uma cadeia vazia como ...
- NULO?
- String vazia?
- Outro campo?
- Qualquer outra maneira?
null
feature-comparison
empty-string
Maniero
fonte
fonte
NULL
ou nãoEu não sei sobre MySQL e PostgreSQL, mas deixe-me tratar isso um pouco em geral.
Existe um DBMS, ou seja, o 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 como uma string vazia como esta:
o seguinte leva ao mesmo resultado
Mas, para selecionar as colunas em que o valor está vazio ou NULL, você deve usar
Usando
está sintaticamente correto, mas nunca retorna uma linha.
Por outro lado, ao concatenar seqüências de caracteres no Oracle. Varchar NULL são tratados como cadeias vazias.
produz abc . Outros DBMS retornariam NULL nesses casos.
Quando você deseja expressar explicitamente que um valor é atribuído, é necessário usar algo como ''.
E você precisa se preocupar se o corte não vazio resulta em NULL
Faz.
Agora, olhando para o DBMS onde '' não é idêntico ao 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 os dois. Uma das exceções que eu conheço é quando sua coluna representa alguma configuração e você não possui padrões vazios para elas. Quando você pode distinguir entre '' e NULL, é possível expressar que sua configuração está vazia e evitar que o padrão se aplique.
fonte
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 existe um valor de string com 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, salve-o comoNULL
(ou seja, o usuário não forneceu o valor) e não como uma sequência vazia (já que não há gênero com valor '').fonte
É importante lembrar que, quando você tem um campo que não é obrigatório, mas qualquer valor presente deve ser exclusivo, será necessário armazenar valores vazios como NULL. Caso contrário, você poderá ter apenas uma tupla com um valor vazio nesse campo.
Existem também algumas diferenças com álgebra relacional e valores NULL: NULL! = NULL, por exemplo.
fonte
UNIQUE
restrição. Felizmente, a partir de 2008, você pode usar um índice filtrado para obter um comportamento adequado.Você também pode levar em consideração a crítica de NULL por Date e os problemas de 3VL em SQL e Teoria Relacional (e a crítica de Rubinson à crítica de Date, Nulls, lógica de três valores e ambiguidade em SQL: crítica da crítica de date ).
Ambos são referenciados e discutidos detalhadamente em um encadeamento SO relacionado, Opções para eliminar colunas NULLable de um modelo de banco de dados .
fonte
Um novo pensamento, uma grande influência na sua escolha de
NULL
/NOT NULL
é se você estiver usando uma estrutura. Eu uso muito o symfony e o uso deNULL
campos de permissão simplifica parte da verificação de código e dados ao manipular os dados.Se você não estiver usando uma estrutura ou se estiver usando instruções e processamento simples de sql, eu escolheria a opção que você achar que é mais simples de acompanhar. Eu geralmente prefiro NULL para que fazer
INSERT
declarações não seja entediante ao esquecer de definir os campos vaziosNULL
.fonte
Tendo trabalhado com a Oracle ( que não permite que você se diferencie ), cheguei à seguinte conclusão:
De um ponto de vista lógico, isso não importa. Realmente não consigo pensar em um exemplo convincente em que a diferenciação entre NULL e cadeia de comprimento zero agregue qualquer valor no DBMS.
A partir do seguinte: Você possui uma
NULL
coluna capaz que não permite zero-len''
(solução Oracle-ish) ou umaNOT NULL
coluna que permite zero-len.E, 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 vazia: concatenação, comparação etc.Nota: Para voltar à minha experiência com o Oracle: Digamos que você queira gerar uma consulta para uma solicitação de pesquisa. Se você usar,
''
poderá gerarWHERE columnX = <searchvalue>
e ele funcionará para pesquisas de igualdade. Se você usar,NULL
você tem que fazerWHERE columnX=<searchvalue> or (columnX is NULL and serchvalue is NULL)
. Bah! :-)fonte
Eles também são diferentes da perspectiva do design:
por exemplo
Parece:
Vamos inserir alguns dados:
Agora vamos tentar com null:
Isso é permitido.
Soooooo: nulos não são cadeias triviais nem o inverso.
Felicidades
fonte
Se falamos de teoria, as regras do Codd dizem que o RDBMS deve tratar os
NULL
valores de uma maneira especial.Como exatamente isso é usado depende dos arquitetos do banco de dados, dependendo da área real do domínio - tarefa - projeto - aplicação.
fonte