Почему делает Oracle 9i, рассматривают пустую строку как ПУСТОЙ УКАЗАТЕЛЬ?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
206
задан Cade Roux 11 June 2012 в 13:58
поделиться

6 ответов

Я полагаю, что ответ - то, что Oracle очень, очень стара.

Назад в былые дни прежде был стандарт SQL, Oracle сделала проектное решение, что пустые строки в VARCHAR / VARCHAR2 столбцы были NULL и что был только один смысл ПУСТОГО УКАЗАТЕЛЯ (существуют реляционные теоретики, которые дифференцировались бы между данными, которые никогда не запрашивались, данные, где ответ существует, но не известен пользователю, данные, где никто не отвечает, и т.д. все из который составляют некоторый смысл NULL).

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

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

208
ответ дан Justin Cave 23 November 2019 в 04:49
поделиться

Tom Kyte VP Oracle:

НУЛЕВУЮ длину А varchar рассматривают как ПУСТОЙ УКАЗАТЕЛЬ.

'' не рассматривается как ПУСТОЙ УКАЗАТЕЛЬ.

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

'', когда присвоено varchar2 (1) становится, ''который является строкой нулевой длины, и строка нулевой длины является ПУСТОЙ в Oracle (это не длинно'')

57
ответ дан Brian 23 November 2019 в 04:49
поделиться

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

19
ответ дан user67897 23 November 2019 в 04:49
поделиться

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

, которую Oracle приняла решение представить, АННУЛИРУЕТ "невозможным значением" технику. Например, ПУСТОЙ УКАЗАТЕЛЬ в числовом месте будет сохранен как "минус нуль", невозможное значение. Любой минус обнуляет тот результат вычислений, будет преобразован в положительный нуль прежде чем быть сохраненным.

Oracle также приняла решение, ошибочно, полагать, что строка VARCHAR нуля длины (пустая строка) невозможное значение и подходящий выбор для представления ПУСТОГО УКАЗАТЕЛЯ. Оказывается, что пустая строка далека от невозможного значения. Это - даже идентификационные данные при операции конкатенации строк!

документация Oracle предупреждает разработчиков базы данных и разработчиков, что некоторая будущая версия Oracle могла бы повредить эту ассоциацию между пустой строкой и ПУСТЫМ УКАЗАТЕЛЕМ, и повредить любой код, который зависит от той ассоциации.

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

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

17
ответ дан Walter Mitty 23 November 2019 в 04:49
поделиться

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

обработка Oracle ссылок ПУСТЫХ УКАЗАТЕЛЕЙ:

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

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

-6
ответ дан Cade Roux 23 November 2019 в 04:49
поделиться

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

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

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

-1
ответ дан 23 November 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: