Frage

Ich weiß, dass es hat betrachten ‚‘ als NULL, aber das mir nicht viel tun, zu sagen, Warum ist dies der Fall. Als ich die SQL-Spezifikationen verstehen, ‚‘ ist nicht das gleiche wie NULL -. Ist ein gültiges Datum, und das andere ist das Fehlen derselben Information, die

Fühlen Sie sich frei, darüber zu spekulieren, aber bitte angeben, ob das der Fall ist. Wenn es jemand von Oracle ist, wer dazu sagen kann, dass fantastisch sein würde!

War es hilfreich?

Lösung

Ich glaube, die Antwort ist, dass Oracle ist sehr, sehr alt.

Zurück in den alten Tagen, bevor es ein SQL-Standard war, Oracle die Design-Entscheidung, die leeren Zeichenfolge in VARCHAR / VARCHAR2 Säulen waren NULL gemacht und es war nur ein Gefühl von NULL (es gibt relationale Theoretiker, die zwischen Daten unterscheiden würden, die hat nie existiert aufgefordert, für worden, Daten, bei denen die Antwort ist, aber vom Benutzer nicht bekannten Daten, in denen es keine Antwort, usw. von denen alle ein Gefühl von NULL darstellen).

Mit der Zeit, dass der SQL-Standard kam um und vereinbart, dass NULL und die leere Zeichenkette waren getrennte Einheiten, gibt es bereits Oracle-Anwender, den Code hatte, dass die beide waren gleichwertig angenommen. So Oracle war im Grunde mit den Optionen links von vorhandenen Code zu brechen, die Verletzung des SQL-Standard, oder irgendeine Art von Initialisierungsparameter Einführung, die die Funktionalität von potenziell großer Anzahl von Anfragen ändern würde. Verstoß gegen den SQL-Standard (IMHO) war die am wenigsten störend diese drei Optionen.

Oracle hat die Möglichkeit offen gelassen, dass der VARCHAR Datentyp in einer zukünftigen Version der SQL-Standards einzuhalten ändern würde (weshalb jeder VARCHAR2 in Oracle verwendet, da dieses Verhalten des Datentypen ist garantiert das gleiche geht nach vorn zu bleiben).

Andere Tipps

Tom Kyte VP von Oracle:

  

Eine ZERO Länge varchar wird behandelt, als   NULL.

     

'' wird nicht als NULL behandelt.

     

'', wenn sie einen char (1) zugeordnet wird   ‚‘ (Char-Typen sind leer gepolstert   strings).

     

'', wenn sie einen varchar2 zugewiesen (1)   wird zu ‚‘, die eine Null-Länge ist,   String und eine Länge von Null Zeichenfolge   NULL in Oracle (es ist nicht lange '')

Ich vermute, das viel mehr Sinn macht, wenn Sie von Oracle denken, die Art und Weise früher Entwickler wahrscheinlich tat - als verherrlicht Backend für ein Dateneingabesystem. Jedes Feld in der Datenbank entspricht einem Feld in einer Form, die ein Datenerfasser auf seinem Bildschirm sah. Wenn der Betreiber nicht alles in ein Feld eingegeben hat, ob die „Geburtsdatum“ oder „Adresse“ und dann die Daten für dieses Feld ist „unbekannt“. Es gibt keine Möglichkeit für einen Bediener, um anzuzeigen, dass jemand die Adresse ist wirklich ein leerer String, und dass sowieso nicht wirklich viel Sinn.

Oracle-Dokumentation warnt Entwickler für dieses Problem, geht zurück mindestens bis Version 7

Oracle wählte NULLS durch die „unmöglichen Wert“ Technik darzustellen. Zum Beispiel wird eine NULL in einer numerischen Position als „minus Null“ gespeichert werden, einen unmöglichen Wert. Etwaige minus Nullen, die von Berechnungen führen zu einem positiven Null umgewandelt werden, bevor gespeichert werden.

Oracle wählte auch fälschlicherweise das VARCHAR String der Länge Null (die leere Zeichenkette) zu prüfen, für die Darstellung von NULL einen unmöglichen Wert ist, und eine geeignete Wahl zu sein. Es stellt sich heraus, dass die leere Zeichenkette weit von einem unmöglichen Wert ist. Es ist sogar die Identität unter dem Betrieb von String-Verkettung!

Oracle-Dokumentation warnt Datenbank-Designer und Entwickler, dass einige zukünftige Version von Oracle könnte breche diese Assoziation zwischen der leeren Zeichenfolge und NULL, und bricht jeden Code, der auf dieser Vereinigung abhängig ist.

Es gibt Techniken, um Flagge NULLS andere als unmöglich Werte, aber Oracle nicht genutzt haben.

(Ich verwende das Wort „Position“ über die Kreuzung einer Zeile zu bedeuten und eine Spalte.)

Leere Zeichenfolge ist die gleiche wie NULL, nur weil es das „kleinere Übel“, wenn verglichen mit der Situation, wenn die zwei (leere Zeichenkette und null) sind nicht das gleiche.

In Sprachen, in denen NULL und leere String nicht gleich sind, muss man sich immer beide Bedingungen überprüfen.

Nach offiziellen 11g docs

  

Oracle-Datenbank behandelt derzeit einen Zeichenwert mit einer Länge von Null als null. Dies kann jedoch nicht in zukünftigen Versionen richtig sein fortsetzen und Oracle empfiehlt, dass Sie keine leeren Zeichenfolgen die gleiche wie NULL-Werte behandeln kann.

Mögliche Gründe

  1. val IS NOT NULL ist besser lesbar als val != ''
  2. Keine Notwendigkeit, beide Bedingungen val != '' and val IS NOT NULL überprüfen

Beispiel aus dem Buch

   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;

Da die Behandlung nicht als NULL nicht besonders hilfreich ist, auch nicht.

Wenn Sie einen Fehler in diesem Bereich auf Oracle machen, beachten Sie, in der Regel sofort. In SQL Server wird jedoch scheint es zu funktionieren, und das Problem wird nur angezeigt, wenn jemand eine leere Zeichenfolge statt NULL (vielleicht von einer .net-Client-Bibliothek betritt, wo null verschieden ist von „“, aber man sich in der Regel behandelt die gleichen ).

Ich sage nicht, Oracle richtig ist, aber es scheint mir, dass in beiden Richtungen etwa gleich schlecht sind.

Ja, ich habe nichts als Schwierigkeiten hatte, mit Oracle im Umgang mit ungültigen Datetime-Werten (nicht gedruckt, umgewandelt oder irgendetwas sein, nur sah mit der dump () Funktion), die erlaubt in die Datenbank, offenbar durch einige fehlerhafte Version des Clients als binäre Spalte eingefügt werden! So viel zum Schutz der Integrität der Datenbank!

Oracle Umgang mit NULL-Wert Links:

http://digitalbush.com/2007/10/ 27 / oracle-9i-null-Verhalten /

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

Vor allem, null und null-Zeichenfolge wurde als das gleiche von Oracle nicht immer behandelt. Eine Null-Zeichenkette ist, per Definition enthält eine Zeichenfolge keine Zeichen. Dies ist gar nicht das gleiche wie eine Null. NULL ist per definitionem das Fehlen von Daten.

Fünf oder sechs Jahre oder so her, dass Null-String anders null durch Oracle behandelt. Während wie null, null war Folge gleich alles und verschieden von allem (was ich denke, für null in Ordnung ist, aber völlig falsch für Null-String), zumindest Länge (Null-String) würde 0 zurück, wie es sollte, da Null-String ist eine Zeichenfolge der Länge Null.

Zur Zeit in Oracle, Länge (null) gibt null zurück, was ich denke, ist O. K., aber Länge (null Zeichenfolge) gibt auch null, die völlig falsch ist.

Ich verstehe nicht, warum sie diese 2 verschiedenen „Werte“ die gleiche Behandlung zu beginnen entschieden. Sie bedeuten verschiedene Dinge, und die Programmierer sollten jeweils auf unterschiedliche Weise die Fähigkeit zu handeln. Die Tatsache, dass sie ihre Methodik geändert haben sagt mir, dass sie wirklich haben keine Ahnung, wie sollten diese Werte behandelt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top