Pergunta

Eu sei que faz consideram '' como NULL, mas isso não faz muita coisa para me dizer por este é o caso. Como eu entendo as especificações SQL, '' não é o mesmo que NULL -. É um dado válido, eo outro é o que indica a ausência dessa mesma informação

Sinta-se livre para especular, mas por favor, indicar se esse for o caso. Se há alguém da Oracle que pode comentar sobre ele, isso seria fantástico!

Foi útil?

Solução

Creio que a resposta é que a Oracle é muito, muito velho.

De volta aos velhos tempos antes que houvesse um padrão SQL, Oracle tomou a decisão de design que strings vazias em VARCHAR colunas / VARCHAR2 foram NULL e que só havia uma sensação de NULL (existem teóricos relacionais que diferenciam entre os dados que nunca foi solicitado para, de dados onde a resposta existe, mas não é conhecido pelo usuário, de dados onde não há resposta, etc. todos os quais constituem algum sentido de NULL).

No momento em que o padrão SQL veio ao redor e concordaram que NULL ea cadeia vazia eram entidades distintas, já havia usuários Oracle que tinham código que assumiu os dois eram equivalentes. Assim, a Oracle foi basicamente deixado com as opções de quebrar o código existente, violando o padrão SQL, ou a introdução de algum tipo de parâmetro de inicialização que iria mudar a funcionalidade potencialmente grande número de consultas. Violar o padrão SQL (IMHO) foi o menos perturbador dessas três opções.

A Oracle deixou em aberto a possibilidade de que o tipo de dados VARCHAR mudaria em uma versão futura a aderir ao padrão SQL (que é por isso que todos os usos VARCHAR2 no Oracle já que o comportamento desse tipo de dados é garantido para permanecer o mesmo daqui para frente).

Outras dicas

Tom Kyte VP da Oracle:

Um zero VARCHAR comprimento é tratado como NULL.

'' não é tratado como NULL.

'' quando atribuído a um char (1) torna-se '' (Tipo CHAR são acolchoado em branco cordas).

'' quando atribuído a um varchar2 (1) torna-se '', que é um comprimento zero corda e uma cadeia de comprimento zero é NULL em Oracle (não é longa '')

Eu suspeito que isso faz muito mais sentido se você pensar da Oracle a maneira desenvolvedores anteriores provavelmente fez - como um backend glorificado para um sistema de entrada de dados. Cada campo no banco de dados correspondeu a um campo de uma forma que uma serra operador de entrada de dados em sua tela. Se o operador não digite nada em um campo, se isso é "data de nascimento" ou "endereço", em seguida, os dados para esse campo é "desconhecido". Não há nenhuma maneira de um operador para indicar endereço que alguém é realmente uma cadeia vazia, e que realmente não faz muito sentido de qualquer maneira.

do Oracle alertas documentação desenvolvedores para este problema, de volta, pelo menos, indo tão longe como a versão 7.

A Oracle escolheu para representar NULLS pela técnica de "valor impossível". Por exemplo, um NULL em um local numérico será armazenado como "Zero menos", um valor impossível. Quaisquer zeros menos que resultam de cálculos serão convertidos para zero positivo antes de ser armazenado.

A Oracle também escolheu, erroneamente, a considerar a cadeia VARCHAR de comprimento zero (a cadeia vazia) para ser um valor impossível, e uma escolha adequada para representar NULL. Acontece que a cadeia vazia está longe de ser um valor impossível. É mesmo a identidade sob a operação de concatenação!

documentação do Oracle adverte designers de banco de dados e desenvolvedores que alguma versão futura do Oracle poder quebrar essa associação entre a string vazia e NULL, e quebrar qualquer código que depende dessa associação.

Existem técnicas para diferentes valores impossíveis NULLS bandeira, mas a Oracle não usá-los.

(estou usando a palavra "local" acima para significar a intersecção de uma linha e uma coluna.)

string vazio é o mesmo que NULL simplesmente porque é o "mal menor" quando comparado com a situação quando os dois (string vazia e null) não são os mesmos.

Em linguagens onde NULL e esvaziar Cordas não são as mesmas, é preciso sempre verificar ambas as condições.

De acordo com docs 11g oficiais

Oracle Database atualmente trata um valor de caracteres com um comprimento de zero como nulo. No entanto, isso não pode continuar a ser verdade em lançamentos futuros, e Oracle recomenda que você faça cadeias vazias não tratar a mesma como nulos.

As possíveis razões

  1. val IS NOT NULL é mais legível do que val != ''
  2. Não há necessidade de verificar ambas as condições val != '' and val IS NOT NULL

Exemplo do livro

   set serveroutput on;   
    DECLARE
    empty_varchar2 VARCHAR2(10) := '';
    empty_char CHAR(10) := '';
    BEGIN
    IF empty_varchar2 IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('empty_varchar2 is NULL');
    END IF;


    IF '' IS NULL THEN
    DBMS_OUTPUT.PUT_LINE(''''' is NULL');
    END IF;

    IF empty_char IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('empty_char is NULL');
    ELSIF empty_char IS NOT NULL THEN
    DBMS_OUTPUT.PUT_LINE('empty_char is NOT NULL');
    END IF;

    END;

Porque não tratá-lo como NULL não é particularmente útil, também.

Se você cometer um erro nesta área em Oracle, você costuma notar de imediato. No servidor SQL, no entanto, ele aparecerá ao trabalho, e que o problema só aparece quando alguém entra em uma cadeia vazia em vez de NULL (talvez a partir de uma biblioteca cliente .NET, onde nulo é diferente de "", mas você costuma tratá-los da mesma ).

Não estou dizendo que Oracle é certo, mas parece-me que os dois lados são aproximadamente igualmente ruim.

nada Na verdade, eu tive, mas dificuldades em lidar com a Oracle, incluindo os valores de data e hora inválidos (não podem ser impressas, convertido nem nada, apenas olhou com a função DUMP ()), que são permitido para ser inserido no banco de dados, aparentemente através de alguma versão de buggy do cliente como uma coluna de binário! Tanto para proteger a integridade do banco de dados!

manipulação Oracle of nulos links:

http://digitalbush.com/2007/10/ 27 / oracle-9i-nulo comportamento /

http://jeffkemponoracle.com/2006/02/empty -string-andor-null.html

Antes de mais nada, nulo e cadeia nula nem sempre foram tratados como a mesma pela Oracle. Uma string nula é, por definição, uma string que não contém caracteres. Isso não é de todo a mesma como um nulo. NULL é, por definição, a ausência de dados.

Cinco ou seis anos ou mais atrás, cadeia nula foi tratado de forma diferente de nulo pela Oracle. Embora, como null, null string foi igual a tudo e diferente de tudo (que eu acho que é bom para nula, mas totalmente errado para string nula), pelo menos comprimento (string null) retornaria 0, como deveria desde string nula é uma cadeia de comprimento zero.

Actualmente no Oracle, comprimento (null) retorna null que eu acho que é O.K., mas length (string null) também retorna null que é totalmente errado.

Eu não entendo por que eles decidiram começar a tratar estes 2 "valores" distintos da mesma. Eles querem dizer coisas diferentes e o programador deve ter a capacidade de agir em cada de maneiras diferentes. O fato de que eles mudaram sua metodologia me diz que eles realmente não têm a menor idéia de como esses valores devem ser tratados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top