Domanda

So che considera '& nbsp;' come NULL , ma questo non fa molto per dirmi perché questo è il caso. A quanto ho capito le specifiche SQL, "& nbsp;" non è lo stesso di NULL : uno è un dato valido e l'altro indica l'assenza di quelle stesse informazioni.

Sentiti libero di speculare, ma per favore indica se è così. Se c'è qualcuno di Oracle che può commentarlo, sarebbe fantastico!

È stato utile?

Soluzione

Credo che la risposta sia che Oracle sia molto, molto vecchia.

Ai vecchi tempi prima che esistesse uno standard SQL, Oracle prese la decisione di progettazione che le stringhe vuote nelle colonne VARCHAR / VARCHAR2 fossero NULL e che c'era solo un senso di NULL (ci sono teorici relazionali che distinguerebbero tra dati che non sono mai stati richiesti, dati in cui esiste la risposta ma non sono conosciuti dall'utente, dati in cui non c'è risposta, ecc. tutti di cui costituiscono un certo senso di NULL ).

Quando arrivò lo standard SQL e concordarono che NULL e la stringa vuota erano entità distinte, c'erano già utenti Oracle che avevano un codice che presupponeva che i due fossero equivalenti. Quindi a Oracle è praticamente rimasta la possibilità di rompere il codice esistente, violare lo standard SQL o introdurre una sorta di parametro di inizializzazione che cambierebbe la funzionalità di un numero potenzialmente elevato di query. La violazione dello standard SQL (IMHO) è stata la meno distruttiva di queste tre opzioni.

Oracle ha lasciato aperta la possibilità che il tipo di dati VARCHAR cambierà in una versione futura per aderire allo standard SQL (motivo per cui tutti usano VARCHAR2 in Oracle dal il comportamento di quel tipo di dati è garantito per rimanere lo stesso in futuro).

Altri suggerimenti

Tom Kyte VP di Oracle:

  

Un varchar di lunghezza ZERO viene trattato come   NULL.

     

'' non è trattato come NULL.

     

'' quando assegnato a un carattere (1) diventa   '' (i tipi di carattere sono imbottiti vuoti   stringhe).

     

'' quando assegnato a un varchar2 (1)   diventa '' che è una lunghezza zero   stringa e una stringa di lunghezza zero è   NULL in Oracle (non è lungo '')

Sospetto che questo abbia molto più senso se pensi a Oracle come probabilmente avevano fatto gli sviluppatori precedenti, come un backend glorificato per un sistema di immissione dei dati. Ogni campo nel database corrispondeva a un campo in una forma che un operatore di immissione dei dati vedeva sul suo schermo. Se l'operatore non ha digitato nulla in un campo, indipendentemente dal fatto che sia " data di nascita " o "indirizzo" quindi i dati per quel campo sono "sconosciuti". Non c'è modo per un operatore di indicare che l'indirizzo di qualcuno è davvero una stringa vuota e che comunque non ha molto senso.

La documentazione Oracle avvisa gli sviluppatori di questo problema, risalendo almeno alla versione 7.

Oracle ha scelto di rappresentare NULL dal "valore impossibile" tecnica. Ad esempio, un NULL in una posizione numerica verrà memorizzato come "meno zero", un valore impossibile. Tutti gli zero negativi risultanti dai calcoli verranno convertiti in zero positivo prima di essere memorizzati.

Oracle ha anche scelto, erroneamente, di considerare la stringa VARCHAR di lunghezza zero (la stringa vuota) come un valore impossibile e una scelta adatta per rappresentare NULL. Si scopre che la stringa vuota è lungi dall'essere un valore impossibile. È persino l'identità sotto l'operazione di concatenazione di stringhe!

La documentazione di Oracle avverte i progettisti e gli sviluppatori di database che potrebbe essere una versione futura di Oracle interrompere questa associazione tra la stringa vuota e NULL e interrompere qualsiasi codice che dipende da tale associazione.

Esistono tecniche per contrassegnare NULL diversi dai valori impossibili, ma Oracle non li ha utilizzati.

(Sto usando la parola "posizione" sopra per indicare l'intersezione di una riga e una colonna.)

La stringa vuota è uguale a NULL semplicemente perché è il "male minore" rispetto alla situazione in cui i due (stringa vuota e null) non sono uguali.

Nelle lingue in cui NULL e String vuota non sono uguali, è necessario controllare sempre entrambe le condizioni.

Secondo i documenti ufficiali 11g

  

Attualmente Oracle Database considera null un valore di carattere con una lunghezza pari a zero. Tuttavia, ciò potrebbe non essere vero nelle versioni future e Oracle consiglia di non trattare le stringhe vuote come null.

Possibili ragioni

  1. val IS NOT NULL è più leggibile di val! = ''
  2. Non è necessario controllare entrambe le condizioni val! = '' e val IS NOT NULL

Esempio dal libro

   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;

Perché non trattarlo come NULL non è particolarmente utile.

Se commetti un errore in quest'area su Oracle, di solito noterai subito. In SQL Server, tuttavia, sembrerà funzionare e il problema si presenta solo quando qualcuno inserisce una stringa vuota anziché NULL (forse da una libreria client .net, dove null è diverso da " " ;, ma di solito li tratti lo stesso).

Non sto dicendo che Oracle abbia ragione, ma mi sembra che entrambi i modi siano approssimativamente ugualmente cattivi.

In effetti, non ho avuto nient'altro che difficoltà a gestire Oracle, inclusi valori datetime non validi (non è possibile stampare, convertire o altro, ho appena guardato con la funzione DUMP ()) a cui è consentito essere inserito nel database, apparentemente attraverso una versione errata del client come una colonna binaria! Questo per quanto riguarda la protezione dell'integrità del database!

Gestione Oracle dei collegamenti NULL:

http://digitalbush.com/2007/10/ 27 / Oracle 9i-nullo-comportamento /

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

Prima di tutto, le stringhe null e null non erano sempre trattate come le stesse da Oracle. Una stringa nulla è, per definizione, una stringa che non contiene caratteri. Questo non è affatto uguale a null. NULL è, per definizione, l'assenza di dati.

Cinque o sei anni circa, la stringa null è stata trattata diversamente da null da Oracle. Mentre, come null, la stringa null era uguale a tutto e diversa da tutto (che penso vada bene per null, ma totalmente SBAGLIATA per stringa null), almeno la lunghezza (stringa null) restituirebbe 0, come dovrebbe poiché la stringa null è una stringa di lunghezza zero.

Attualmente in Oracle, length (null) restituisce null che immagino sia O.K., ma length (null string) restituisce anche null che è totalmente SBAGLIATO.

Non capisco perché abbiano deciso di iniziare a trattare questi 2 distinti "valori". lo stesso. Significano cose diverse e il programmatore dovrebbe avere la capacità di agire su ciascuno in modi diversi. Il fatto che abbiano cambiato la loro metodologia mi dice che in realtà non hanno idea di come questi valori debbano essere trattati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top