Мне интересны в основном MySQL и PostgreSQL, но вы можете ответить на следующие вопросы в целом:
- Есть ли логический сценарий, в котором было бы полезно отличить пустую строку от NULL?
Каковы будут физические последствия хранения для хранения пустой строки как ...
- ЗНАЧЕНИЕ NULL?
- Пустой строкой?
- Другое поле?
- Любым другим путем?
null
feature-comparison
empty-string
Maniero
источник
источник
NULL
или нетЯ не знаю о MySQL и PostgreSQL, но позвольте мне немного об этом поговорить.
Существует одна СУБД, а именно Oracle, которая не позволяет выбирать пользователей между NULL и ''. Это ясно демонстрирует, что нет необходимости различать оба. Есть некоторые досадные последствия:
Вы устанавливаете varchar2 в пустую строку следующим образом:
следующее приводит к тому же результату
Но чтобы выбрать столбцы, в которых значение пусто или равно NULL, необходимо использовать
С помощью
синтаксически правильно, но никогда не возвращает строку.
С другой стороны, при объединении строк в Oracle. NULL varchars обрабатываются как пустые строки.
дает abc . Другие СУБД возвращали бы NULL в этих случаях.
Если вы хотите явно указать, что значение назначено, вы должны использовать что-то вроде ''.
И вам нужно беспокоиться, приведет ли обрезка к пустым значениям в NULL
Оно делает.
Теперь посмотрим на СУБД, где '' не совпадает с NULL (например, SQL-сервер)
Работать с '', как правило, проще, и в большинстве случаев нет практической необходимости различать оба. Одно из исключений, которое я знаю, это когда ваш столбец представляет некоторые настройки, и у вас нет пустых значений по умолчанию для них. Когда вы можете различить '' и NULL, вы можете указать, что ваш параметр пуст и избежать применения по умолчанию.
источник
Это зависит от домена, на котором вы работаете.
NULL
означает отсутствие значения (т. е. нет значения ), а пустая строка означает, что есть строковое значение нулевой длины.Например, скажем, у вас есть таблица для хранения данных человека, и она содержит
Gender
столбец. Вы можете сохранить значения как «Мужской» или «Женский». Если пользователь может выбрать не предоставлять половые данные, вы должны сохранить их какNULL
(т. Е. Пользователь не предоставил значение), а не пустую строку (поскольку нет пола со значением '').источник
Стоит помнить одну вещь: если у вас есть поле, которое не является обязательным, но любые значения, которые присутствуют, должны быть уникальными, вам потребуется хранить пустые значения как NULL. В противном случае у вас будет только один кортеж с пустым значением в этом поле.
Существуют также некоторые различия с реляционной алгеброй и значениями NULL: например, NULL! = NULL.
источник
UNIQUE
ограничение. К счастью, начиная с 2008 года вы можете использовать отфильтрованный индекс, чтобы получить правильное поведение.Вы также можете учесть критику Дейлом NULL и проблемы 3VL в SQL и реляционной теории (и критику Рубинсоном критики Дейта, нулей, трехзначной логики и неоднозначности в SQL: критика критики Дейта ).
Обе ссылки и подробно обсуждаются в связанном SO потоке, Опции для исключения столбцов NULLable из модели БД .
источник
Новая мысль, большое влияние на ваш выбор
NULL
/NOT NULL
, если вы используете каркас. Я часто использую Symfony, а использование разрешающихNULL
полей упрощает проверку кода и данных при манипулировании данными.Если вы не используете каркас или если вы используете простые SQL-операторы и обработку, я бы выбрал тот вариант, который вам проще отслеживать. Я обычно предпочитаю NULL, чтобы
INSERT
операторы не утомительно забыли установить пустые поляNULL
.источник
Приходясь работать с Oracle ( что не позволяет вам дифференцироваться ), я пришел к следующему выводу:
С логической точки зрения это не имеет значения. Я действительно не могу вспомнить убедительный пример, когда различие между NULL и строкой нулевой длины добавляет какое-либо значение в СУБД.
Из чего следует: У вас есть либо
NULL
столбец, который не допускает нулевую длину''
(решение Oracle-ish), либоNOT NULL
столбец, который допускает нулевую длину.И из моего опыта,
''
делает намного больше смысла при обработке данных, так как обычно вы хотели бы обработать отсутствие строки как пустая строка: конкатенация, сравнение и т.д.Примечание. Вернемся к моему опыту работы с Oracle. Предположим, вы хотите сгенерировать запрос для поискового запроса. Если вы используете,
''
вы можете просто генерировать,WHERE columnX = <searchvalue>
и это будет работать для поиска равенства. Если вы используете,NULL
вы должны сделатьWHERE columnX=<searchvalue> or (columnX is NULL and serchvalue is NULL)
. Ба! :-)источник
Они также отличаются с точки зрения дизайна:
например
Выглядит как:
Давайте введем некоторые данные:
Теперь давайте попробуем с нулем:
Это разрешено
Оооочень: нули не являются ни тривиальными строками, ни обратными.
ура
источник
Если говорить о теории, то правила Кодда гласят, что СУБД должна обрабатывать
NULL
значения особым образом.Как именно это используется, зависит от архитекторов баз данных, в зависимости от конкретной области - задача - проект - область применения.
источник