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

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

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

sql,oracle,null,string,

194

Ответов: 10


201 принят

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

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

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

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


56 ов

Том Ките вице-президент Oracle:

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

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

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

'', когда назначается varchar2 (1), становится «", которая является строкой нулевой длины, а строка с нулевой длиной равна NULL в Oracle (она не длинна)


18 ов

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


16

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

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

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

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

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

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


2

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

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

SQL, Oracle, пустой, строка,
Похожие вопросы