Почему Oracle 9i обрабатывает пустую строку как NULL?

Я знаю, что он считает "как" NULL, но это не очень помогает мне объяснить, почему это так. Поскольку я понимаю спецификации SQL, "это не то же самое, что NULL - один является допустимым значением, а другой указывает на отсутствие такой же информации.

Не стесняйтесь спекулировать, но, пожалуйста, укажите, если это произойдет. Если кто-нибудь из Oracle может прокомментировать это, это будет фантастично!

Ответ 1

Я считаю, что ответ заключается в том, что Oracle очень, очень старый.

В прежние дни, прежде чем появился стандарт SQL, Oracle приняло дизайнерское решение о том, что пустые строки в столбцах VARCHAR/VARCHAR2 были NULL и что было только одно чувство NULL (есть теоретики-реляты который будет различать данные, которые никогда не запрашивались, данные, в которых существует ответ, но неизвестный пользователю, данные, в которых нет ответа, и т.д., все из которых составляют некоторый смысл NULL).

К моменту появления стандарта SQL и согласился, что NULL, а пустая строка - разные сущности, уже были пользователи Oracle, у которых был код, который предположил, что два эквивалента. Таким образом, Oracle в основном остался с вариантами нарушения существующего кода, нарушения стандарта SQL или введения некоторого параметра инициализации, который изменил бы функциональность потенциально большого количества запросов. Нарушение стандарта SQL (IMHO) было наименее разрушительным из этих трех вариантов.

Oracle оставила открытой возможность того, что тип данных VARCHAR изменился в будущей версии, чтобы соответствовать стандарту SQL (поэтому каждый использует VARCHAR2 в Oracle, поскольку такое поведение типа данных гарантировано останется прежним вперед).

Ответ 2

Tom Kyte VP of Oracle:

Длина длинной длины varchar обрабатывается как NULL.

'' не рассматривается как NULL.

'', когда присваивается значение char (1), становится '' (char пустые пробелы строки).

'' при назначении varchar2 (1) становится '', которая равна нулю строка и нулевая длина строки NULL в Oracle (это не долго)

Ответ 3

Я подозреваю, что это имеет гораздо больший смысл, если вы думаете о том, как Oracle, как раньше это делали разработчики, - как прославленный бэкэнд для системы ввода данных. Каждое поле в базе данных соответствовало полю в форме, которую оператор ввода данных видел на своем экране. Если оператор ничего не вводил в поле, будь то "дата рождения" или "адрес", тогда данные для этого поля "неизвестны". Нет никакого способа, чтобы оператор указывал, что какой-то адрес действительно пустая строка, и это на самом деле не имеет особого смысла.

Ответ 4

Документация Oracle предупреждает разработчиков об этой проблеме, возвращаясь по крайней мере до версии 7.

Oracle выбрала представление NULLS методом "невозможного значения". Например, NULL в числовом расположении будет сохранен как "минус нуль", значение невозможно. Любые минус-нули, возникающие в результате вычислений, перед сохранением будут преобразованы в положительный ноль.

Oracle также ошибочно решил, что строка VARCHAR с нулевой длиной (пустая строка) является невозможным значением и подходящим выбором для представления NULL. Оказывается, пустая строка далека от невозможного. Это даже тождество при операции конкатенации строк!

Документация Oracle предупреждает разработчиков и разработчиков баз данных о том, что некоторая будущая версия Oracle может разбить эту связь между пустой строкой и NULL и разбить любой код, который зависит от этой ассоциации.

Существуют методы, чтобы флаг NULLS отличался от невозможных значений, но Oracle их не использовал.

(Я использую слово "location" выше для обозначения пересечения строки и столбца.)

Ответ 5

Пустая строка такая же, как NULL, просто потому, что ее "меньшее зло" по сравнению с ситуацией, когда две (пустая строка и нуль) не совпадают.

В языках, где NULL и пустые строки не совпадают, нужно всегда проверять оба условия.

Ответ 6

Потому что не рассматривать его как NULL, не особенно полезно.

Если вы ошибаетесь в этой области в Oracle, вы обычно замечаете сразу. Однако на сервере SQL он работает, и проблема возникает только тогда, когда кто-то вводит пустую строку вместо NULL (возможно, из клиентской библиотеки .net, где null отличается от "", но вы обычно относитесь к ним одинаково).

Я не говорю, что Oracle прав, но мне кажется, что оба способа примерно одинаковы.

Ответ 7

Согласно официальным документам 11g

В Oracle Database в настоящее время обрабатывается значение символа с нулем как null. Однако в будущих выпусках это не может продолжаться, и Oracle рекомендует не обрабатывать пустые строки так же, как и нули.

Возможные причины

  • val IS NOT NULL более читабельна, чем val != ''
  • Не нужно проверять оба условия val != '' and val IS NOT NULL

Ответ 8

Пример из книги

   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;

Ответ 9

В действительности, у меня не было ничего, кроме трудностей в работе с Oracle, включая недопустимые значения даты и времени (невозможно напечатать, преобразовать или что-либо еще, просто посмотреть с помощью функции DUMP()), которые разрешены быть вставлен в базу данных, по-видимому, через какую-то ошибочную версию клиента как двоичный столбец! Так много для защиты целостности базы данных!

Обработка Oracle ссылок NULL:

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

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

Ответ 10

Прежде всего, нулевая и нулевая строка не всегда считались Oracle одинаковыми. Нулевая строка - по определению строка, не содержащая символов. Это совсем не то же самое, что и null. NULL является, по определению, отсутствием данных.

Пять или шесть лет назад нулевая строка обрабатывалась Oracle по-разному от нуля. Хотя, как и null, нулевая строка была равна всем и отличается от всего (что, я думаю, подходит для null, но полностью WRONG для пустой строки), по крайней мере длина (пустая строка) вернет 0, как и должно быть, поскольку нулевая строка строка нулевой длины.

В настоящее время в Oracle длина (null) возвращает значение null, которое, как я полагаю, является O.K., но length (null string) также возвращает null, что полностью НЕПРАВИЛЬНО.

Я не понимаю, почему они решили начать рассматривать эти два разных "значения" одинаково. Они означают разные вещи, и программист должен иметь возможность действовать по каждому по-разному. Тот факт, что они изменили свою методологию, говорит мне, что они действительно не имеют понятия о том, как следует обрабатывать эти значения.