В чем преимущество пустого строкового значения по сравнению с использованием нулевого значения - PullRequest
5 голосов
/ 09 сентября 2011

Вот моя проблема:

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

Я заметил, что все «отставшие», которые появляются в моих отчетах, по-видимому, последовательно имеют значения NULL в определенных полях.

Глядя на структуру базы данных, я обнаружил, что для этих значений NULL в базе данных установлен флаг NOT NULL.

Оказывается, что на самом деле это не пустые значения, а пустые строковые значения или $ value = ''

В моем прошлом опыте, когда я начинал, я часто совершал эту ошибку, устанавливая что-то = '' вместо того, чтобы делать это NULL.

Я спросил администратора базы данных, может ли он придумать какую-либо законную причину, по которой они установлены таким образом (есть 300 000 нечетных записей, подобных этой), и он не имел ни малейшего понятия.

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

Так что я ломаю голову здесь, пытаясь найти законную причину их существования, кроме моих собственных подозрений, что база данных не была разработана для этих двух типов записей: записи с этим значением и записи без этого значения .

Что ты думаешь?

Ответы [ 5 ]

2 голосов
/ 09 сентября 2011

В чем преимущество пустого строкового значения по сравнению с использованием нулевого значения

Нет никаких реальных проблем с использованием одного или другого, исключительно.Проблемы возникают, когда один столбец может содержать один из них, в основном с сортировкой и поиском:

Сортировка

SELECT '' as c1
UNION 
SELECT NULL as c1
UNION
SELECT 'a' as c1
ORDER BY c1

Вы увидите, что сначала будет указан NULL s, а затем строковые значения (сначала пусто).Об этом следует помнить, если вы выполняете несколько столбцов ORDER BY с и вам интересно, почему некоторые столбцы всегда находятся сверху.

Поиск

Когда столбец NULL, вам нужно искать по IS NULL или IS NOT NULL, а не = ''.Кроме того, когда вы делаете LENGTH( c1 ) = 0, эти NULL записи не будут включены, в то время как пустые строки будут.

Наконец, когда вы сравниваете столбец с самим собой в самостоятельном соединении, вы не сможете сделать простое =.


В целом, этобыло бы лучше согласовать значения столбцов с одним или другим и сделать ваш SQL согласованным.

2 голосов
/ 09 сентября 2011

Я видел это довольно часто, особенно в случаях, когда:

  • База данных обслуживается множеством клиентов (основное приложение, специальные запросы, интерфейсы автоматического импорта ...)
  • Данные были преобразованы или перенесены из одной системы в другую

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

Я склонен быть очень осторожным с пустыми строками и нулями, потому что меня укусили те же проблемы. Часто есть причины совместимости, которые мешают изменить структуру БД, поэтому у вас есть обходные пути, такие как ISNULL(c1,'') или COALESCE(c1,'') для захвата как нулевых, так и пустых строк.

1 голос
/ 09 сентября 2011

Использование NULL в качестве значения в базе данных имеет свои критические замечания, я хотел бы обратиться к статье Википедии о NULL для объяснения некоторых странностей, которые NULL может внести в ваши запросы. 1003 *

Так что, вероятно, архитектор базы данных не был фанатом NULL, возможно, после прочтения "Третьего манифеста". Этот PDF (один из авторов Третьего Манифеста) может помочь вам понять проблему и показать, как можно обрабатывать особый случай пропущенных значений.

0 голосов
/ 02 апреля 2013

По моему мнению, пустая строка представляет отсутствие значения , в то время как NULL представляет неизвестное значение .

Так что, по моему мнению, "" конкретнее, чем NULL.Например, если место рождения человека неизвестно, его можно хранить как NULL, но не так, как "".Если у человека нет отчества, и известно, что у него его нет, то лучше хранить "", чем NULL.

Причина: NULL является единственнымспособ указать, что неизвестно значение, которое работает для всех типов данных.Пустая строка "" больше похожа на 0 для целых чисел.

0 голосов
/ 09 сентября 2011

Итак, вы начали работать, даже не изучив базу данных, и столкнулись с проблемой установки неправильных критериев в своих запросах.

А теперь ты ищешь человека, виновного.
Очень умный.

Однако ваш вопрос здесь не такой умный.
Поскольку невозможно определить, хороша или плоха пустая строка, не зная структуры таблицы, подробности отчета и тому подобное.

...