[Sql] Warum behandelt Oracle 9i eine leere Zeichenfolge als NULL?


Answers

Tom Kyte VP von Oracle:

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

'' wird nicht als NULL behandelt.

'' Wenn es einem Char (1) zugewiesen wird, wird '' (Char-Typen sind leere gepolsterte Strings).

'' wenn es einem varchar2 (1) zugewiesen wird, wird '' das ist eine Null-Länge-Zeichenfolge und eine Null-Länge-Zeichenfolge ist NULL in Oracle (es ist nicht lang '')

Question

Ich weiß, dass es " NULL , aber das sagt mir nicht viel, warum das so ist. Wie ich die SQL-Spezifikationen verstehe, ist '' nicht das Gleiche wie NULL - ein ist ein gültiges Datum und das andere zeigt die Abwesenheit derselben Information an.

Fühlen Sie sich frei zu spekulieren, aber bitte geben Sie an, ob das der Fall ist. Wenn es jemanden von Oracle gibt, der etwas dazu sagen kann, wäre das fantastisch!




Oracle-Dokumentation warnt Entwickler vor diesem Problem und geht mindestens so weit wie Version 7 zurück.

Oracle entschied sich dafür, NULLS nach der "Unmöglich-Value" -Technik darzustellen. Zum Beispiel wird ein NULL an einem numerischen Ort als "minus Null" gespeichert, ein unmöglicher Wert. Alle negativen Nullen, die sich aus den Berechnungen ergeben, werden vor dem Speichern in positive Nullwerte umgewandelt.

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

Die Oracle-Dokumentation warnt Datenbankdesigner und Entwickler, dass einige zukünftige Versionen von Oracle diese Verbindung zwischen der leeren Zeichenfolge und NULL unterbrechen könnten und jeden Code brechen könnten, der von dieser Zuordnung abhängt.

Es gibt Techniken, um NULL andere als unmögliche Werte zu markieren, aber Oracle hat sie nicht verwendet.

(Ich verwende das Wort "location" oben, um den Schnittpunkt einer Zeile und einer Spalte zu bezeichnen.)




Beispiel aus 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;



Weil es nicht besonders hilfreich ist, sie nicht als NULL zu behandeln.

Wenn Sie in diesem Bereich auf Oracle einen Fehler machen, bemerken Sie dies normalerweise sofort. In SQL Server scheint es jedoch zu funktionieren, und das Problem tritt nur auf, wenn jemand eine leere Zeichenfolge anstelle von NULL eingibt (möglicherweise aus einer .net-Clientbibliothek, in der sich null von "" unterscheidet), aber Sie behandeln sie normalerweise gleich ).

Ich sage nicht, dass Oracle recht hat, aber es scheint mir, dass beide Wege ungefähr gleich schlecht sind.




Tatsächlich hatte ich nur Schwierigkeiten mit Oracle zu tun, einschließlich ungültiger Datum / Zeit-Werte (kann nicht gedruckt, konvertiert oder irgendetwas, nur mit der DUMP () -Funktion betrachtet werden), die in die Datenbank eingefügt werden können, anscheinend durch einen Buggy Version des Clients als binäre Spalte! So viel zum Schutz der Datenbankintegrität!

Oracle-Behandlung von NULL-Links:

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

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