Eu sei que não consideram '' como NULL
, mas isso não faz muita coisa para me dizer por que este é o caso. Pelo que entendi as especificações SQL, '' não é o mesmo que NULL
- um é um dado válido e o outro está indicando a ausência dessas mesmas informações.
Sinta-se à vontade para especular, mas indique se é esse o caso. Se houver alguém da Oracle que possa comentar sobre isso, isso seria fantástico!
Respostas:
Acredito que a resposta é que o Oracle é muito, muito antigo.
Nos velhos tempos, antes de haver um padrão SQL, a Oracle tomava a decisão de design de que as strings vazias em
VARCHAR
/VARCHAR2
columns eramNULL
e que havia apenas um sentido de NULL (existem teóricos relacionais que diferenciam os dados que nunca foram solicitados, dados em que a resposta existe, mas não é conhecida pelo usuário, dados em que não há resposta etc., todos os quais constituem algum senso deNULL
).No momento em que o padrão SQL apareceu e concordou que isso
NULL
e a sequência vazia eram entidades distintas, já havia usuários do Oracle que tinham código que supunha que os dois fossem equivalentes. Portanto, a Oracle ficou basicamente com as opções de quebrar o código existente, violar o padrão SQL ou introduzir algum tipo de parâmetro de inicialização que alteraria a funcionalidade de um número potencialmente grande de consultas. A violação do padrão SQL (IMHO) foi a menos perturbadora dessas três opções.A Oracle deixou em aberto a possibilidade de o
VARCHAR
tipo de dados mudar em uma versão futura para aderir ao padrão SQL (razão pela qual todo mundo usaVARCHAR2
no Oracle, pois é garantido que o comportamento desse tipo de dados permanecerá o mesmo daqui para frente).fonte
Tom Kyte VP da Oracle:
fonte
''
está sendo implicitamente convertido em um VARCHAR2, como ocast('' as char(1)) is null
que é ... surpreendentemente VERDADEIROSuspeito que isso faça muito mais sentido se você pensar no Oracle da maneira que os desenvolvedores anteriores provavelmente pensavam - como um back-end glorificado para um sistema de entrada de dados. Cada campo no banco de dados correspondia a um campo em um formato que um operador de entrada de dados via em sua tela. Se o operador não digitou nada em um campo, seja "data de nascimento" ou "endereço", os dados para esse campo são "desconhecidos". Não há como um operador indicar que o endereço de alguém é realmente uma sequência vazia e isso não faz muito sentido.
fonte
A documentação do Oracle alerta os desenvolvedores para esse problema, voltando pelo menos até a versão 7.
A Oracle optou por representar NULLS pela técnica "valor impossível". Por exemplo, um NULL em um local numérico será armazenado como "menos zero", um valor impossível. Quaisquer zeros negativos resultantes de cálculos serão convertidos em zero positivo antes de serem armazenados.
A Oracle também escolheu, erroneamente, considerar a sequência VARCHAR de comprimento zero (a sequência vazia) como um valor impossível e uma opção adequada para representar NULL. Acontece que a cadeia vazia está longe de ser um valor impossível. É até a identidade sob a operação de concatenação de strings!
A documentação da Oracle avisa os desenvolvedores e desenvolvedores de bancos de dados que alguma versão futura do Oracle pode interromper essa associação entre a cadeia vazia e o NULL e interromper qualquer código que dependa dessa associação.
Existem técnicas para sinalizar NULLS que não sejam valores impossíveis, mas a Oracle não as usou.
(Estou usando a palavra "local" acima para significar a interseção de uma linha e uma coluna.)
fonte
String vazia é igual a NULL, simplesmente porque é o "menor mal" quando comparada à situação em que as duas (string vazia e nula) não são iguais.
Nos idiomas em que NULL e String vazia não são iguais, é preciso sempre verificar as duas condições.
fonte
not null
restrição na sua coluna e verificar apenas a sequência vazia.WHERE Field <> ''
retorna true somente se o campo não for NULL e não estiver vazio, nos bancos de dados com comportamento ANSI para cadeias vazias.De acordo com documentos oficiais 11g
Razões possíveis
val IS NOT NULL
é mais legível do queval != ''
val != '' and val IS NOT NULL
fonte
val <> ''
já excluiNULL
. Talvez você quis dizerval = '' OR val IS NULL
. Mas cadeias vazias que não se comparam como NULL são úteis !Exemplo do livro
fonte
Porque não tratá-lo como NULL também não é particularmente útil.
Se você cometer um erro nesta área no Oracle, geralmente notará imediatamente. No SQL Server, no entanto, ele parece funcionar, e o problema só aparece quando alguém digita uma cadeia vazia em vez de NULL (talvez de uma biblioteca cliente .net, onde nulo é diferente de "", mas você geralmente as trata da mesma forma )
Não estou dizendo que a Oracle está certa, mas parece-me que os dois lados são aproximadamente igualmente ruins.
fonte
Na verdade, tive apenas dificuldades em lidar com o Oracle, incluindo valores de data e hora inválidos (não podem ser impressos, convertidos ou qualquer outra coisa, apenas olhei com a função DUMP ()) que podem ser inseridos no banco de dados, aparentemente através de algum bug. versão do cliente como uma coluna binária! Tanta coisa para proteger a integridade do banco de dados!
Manipulação do Oracle de links NULLs:
http://digitalbush.com/2007/10/27/oracle-9i-null-behavior/
http://jeffkemponoracle.com/2006/02/empty-string-andor-null.html
fonte
Antes de tudo, as cadeias nula e nula nem sempre foram tratadas da mesma forma pelo Oracle. Uma cadeia nula é, por definição, uma cadeia que não contém caracteres. Isso não é o mesmo que um nulo. NULL é, por definição, a ausência de dados.
Há cinco ou seis anos, a cadeia nula foi tratada de forma diferente da nula pela Oracle. Enquanto, como nulo, a cadeia nula era igual a tudo e diferente de tudo (o que acho bom para nula, mas totalmente ERRADA para a cadeia nula), pelo menos o comprimento (cadeia nula) retornaria 0, como deveria, pois a cadeia nula é uma cadeia de comprimento zero.
Atualmente no Oracle, length (null) retorna null, o que eu acho que está bem, mas length (null string) também retorna null, que é totalmente ERRADO.
Não entendo por que eles decidiram começar a tratar esses 2 "valores" distintos da mesma forma. Eles significam coisas diferentes e o programador deve ter a capacidade de agir de cada um de maneiras diferentes. O fato de terem mudado sua metodologia me diz que realmente não têm idéia de como esses valores devem ser tratados.
fonte
VARCHAR
campo pode ter um valor (zero ou mais caracteres) ou nenhum valor (NULL), ponto final.NULL
e uma cadeia de valor nula, e essa distinção não faz sentido. Receio que esta resposta seja uma fantasia completa.