Я знаю , что это действительно считают «» , как NULL
, но это не делает много , чтобы сказать мне , почему это так. Как я понимаю в спецификациях SQL, «» - это не то же самое, что NULL
- один является действительным значением, а другой указывает на отсутствие этой же информации.
Не стесняйтесь спекулировать, но, пожалуйста, укажите, так ли это. Если бы кто-нибудь из Oracle мог прокомментировать это, это было бы здорово!
Ответы:
Я считаю, что ответ заключается в том, что Oracle очень, очень старый.
В прежние времена, когда существовал стандарт SQL, Oracle приняла решение о том, что пустые строки в столбцах
VARCHAR
/ и что существует только одно значение NULL (существуют теоретики реляции, которые различают данные, которые никогда не запрашивались, данные, в которых ответ существует, но пользователь не знает их, данные, в которых нет ответа и т. д., все из которых составляют некоторый смысл ).VARCHAR2
NULL
NULL
К тому времени, когда стандарт SQL пришел и согласился с тем, что
NULL
пустая строка была отдельной сущностью, уже были пользователи Oracle, у которых был код, который предполагал, что они эквивалентны. Таким образом, у Oracle остались возможности нарушить существующий код, нарушить стандарт SQL или ввести какой-либо параметр инициализации, который изменит функциональность потенциально большого количества запросов. Нарушение стандарта SQL (IMHO) было наименее разрушительным из этих трех вариантов.Oracle оставила открытой возможность того, что
VARCHAR
тип данных изменится в будущем выпуске, чтобы соответствовать стандарту SQL (именно поэтому все используютVARCHAR2
в Oracle, поскольку поведение этого типа данных будет оставаться неизменным в будущем).источник
Том Кайт, вице-президент Oracle:
источник
''
в настоящее время неявным преобразуются в VARCHAR2, такие , как ,cast('' as char(1)) is null
которая ... удивительно ИСТИНАЯ подозреваю, что это имеет больше смысла, если вы думаете об Oracle так, как, вероятно, делали более ранние разработчики - как о прославленном бэкенде для системы ввода данных. Каждое поле в базе данных соответствует полю в форме, которую оператор ввода данных увидел на своем экране. Если оператор ничего не вводил в поле, будь то «дата рождения» или «адрес», тогда данные для этого поля «неизвестны». Оператор не может указать, что чей-то адрес действительно является пустой строкой, и в любом случае это не имеет особого смысла.
источник
Документация Oracle предупреждает разработчиков об этой проблеме, начиная с версии 7.
Oracle решил представлять NULLS методом «невозможного значения». Например, NULL в числовом месте будет сохранен как «минус ноль», невозможное значение. Любые минус нули, возникающие в результате вычислений, будут преобразованы в положительный ноль перед сохранением.
Oracle также ошибочно решил считать строку VARCHAR нулевой длины (пустая строка) невозможным значением и подходящим выбором для представления значения NULL. Оказывается, пустая строка далека от невозможного значения. Это даже тождество под операцией конкатенации строк!
Документация Oracle предупреждает разработчиков и разработчиков баз данных о том, что некоторые будущие версии Oracle могут разорвать эту связь между пустой строкой и NULL и разорвать любой код, который зависит от этой связи.
Существуют методы для пометки NULLS, отличных от невозможных значений, но Oracle их не использовал.
(Я использую слово «местоположение» выше для обозначения пересечения строки и столбца.)
источник
Пустая строка такая же, как NULL, просто потому, что это «меньшее зло» по сравнению с ситуацией, когда два (пустая строка и ноль) не совпадают.
В языках, где NULL и пустая строка не совпадают, необходимо всегда проверять оба условия.
источник
not null
ограничение для вашего столбца и проверяйте только пустую строку.WHERE Field <> ''
возвращает true, только если поле не NULL и не пусто, в базах данных с поведением ANSI для пустых строк.Согласно официальным документам 11g
Возможные причины
val IS NOT NULL
более читабельно, чемval != ''
val != '' and val IS NOT NULL
источник
val <> ''
уже исключаетNULL
. Возможно, вы имели в видуval = '' OR val IS NULL
. Но пустые строки, которые не сравниваются как NULL, полезны !Пример из книги
источник
Потому что не рассматривать его как NULL тоже не особо полезно.
Если вы делаете ошибку в этой области в Oracle, вы обычно сразу замечаете это. Однако на сервере SQL он будет работать, и проблема возникает только тогда, когда кто-то вводит пустую строку вместо NULL (возможно, из клиентской библиотеки .net, где null отличается от "", но вы обычно относитесь к ним одинаково. ).
Я не говорю, что Oracle прав, но мне кажется, что оба пути примерно одинаково плохи.
источник
В самом деле, у меня не было ничего , кроме трудностей в работе с Oracle, в том числе недействительных значений даты и времени (не могут быть напечатаны, преобразованный или что - нибудь, только смотрел на с функцией DUMP ()) , которые разрешены быть включены в базу данных, по- видимому , через какой - то глючит версия клиента в виде двоичного столбца! Так много для защиты целостности базы данных!
Oracle обрабатывает NULL-ссылки:
http://digitalbush.com/2007/10/27/oracle-9i-null-behavior/
http://jeffkemponoracle.com/2006/02/empty-string-andor-null.html
источник
Прежде всего, пустые и пустые строки не всегда рассматривались Oracle как одинаковые. Нулевая строка по определению является строкой, не содержащей символов. Это совсем не то же самое, что ноль. NULL - это по определению отсутствие данных.
Пять или шесть лет тому назад Oracle считал, что нулевая строка отличается от нулевой. Хотя, как и ноль, нулевая строка была равна всем и отличалась от всего (что я думаю, хорошо для нулевой, но совершенно НЕПРАВИЛЬНО для нулевой строки), по крайней мере длина (нулевая строка) вернет 0, как и должно быть, так как нулевая строка строка нулевой длины.
В настоящее время в Oracle, длина (ноль) возвращает ноль, что я думаю, это нормально, но длина (нулевая строка) также возвращает ноль, что совершенно НЕПРАВИЛЬНО.
Я не понимаю, почему они решили начать относиться к этим двум различным «ценностям» одинаково. Они означают разные вещи, и программист должен иметь возможность воздействовать на каждого по-разному. Тот факт, что они изменили свою методологию, говорит мне, что они действительно не имеют ни малейшего представления о том, как эти значения должны рассматриваться.
источник
VARCHAR
поле может иметь значение (ноль или более символов) или не иметь значения (NULL), полная остановка.NULL
строкой с нулевым значением, и такое различие не имеет смысла. Боюсь, этот ответ - полная фантазия.