NULL vs Empty при работе с пользовательским вводом

да, еще один нулевой и пустой строковый вопрос.

Я согласен с идеей, что NULL означает не установлен, а пустая строка означает "значение, которое пусто". Вот моя проблема: если значение по умолчанию для столбца равно NULL, как разрешить пользователю вводить это значение NULL.

допустим, в системе создается новый пользователь. Есть первое и последнее поля Имя, Фамилия, а отчество нет. При создании пользователя человек увидит 2 текстовых ввода, один для первого и напоследок. Человек выбирает только фамилию. Первое имя технически не установлено. Во время вставки я проверяю длину каждого поля, устанавливая для всех пустых полей значение NULL.

при просмотре базы данных я вижу, что первое имя не установлено. Вопрос, который сразу приходит на ум, что, возможно, они никогда не видели первое поле имя (т. е. из-за ошибки). Но это не так; они ушли, если пустые.

Итак, мой вопрос, как вы решаете, когда поле должно быть установлено в NULL или пустую строку при получении пользовательского ввода? Откуда вы знаете, что пользователь хочет, чтобы поле не было установлено без обнаружения фокуса или если они удалили значение...или...или...?

Вопрос: должен ли я использовать NULL или пустую строку для представления данных в столбце таблицы?

8 ответов


Я почти никогда не использую NULL при обращении к фактическим данным. При использовании для внешних ключей я бы сказал, что NULL допустим, но он почти никогда не действителен для введенных пользователем данных. Единственное исключение, которое, вероятно, возникало бы довольно регулярно, - это даты, которые не существуют, такие как база данных сотрудников с полем "termination_date". В этом случае все текущие сотрудники должны иметь значение NULL в этом поле. Что касается их фактического ввода значения null, для значений, которые действительно требуется значение null, я бы поставил флажок рядом с полем ввода, чтобы пользователь мог проверять его и выключать, чтобы увидеть соответствующее значение null (или более удобным для пользователя способом, none). Если флажок установлен на значение null, соответствующее текстовое поле должно быть отключено, и если значение null уже связано, оно должно начинаться как отключено и включаться только после того, как пользователь снимет флажок null.


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

  1. Если вы начинаете тонко нарезать последствия пробелов, то вы должны каким-то образом убедиться, что каждый другой разработчик читает и пишет так же.

  2. Как вы его в алфавитном порядке?

  3. можете ли вы однозначно определить, когда пользователь пропустил ввод значения, по сравнению с намеренным уходом он пустой?

  4. Как бы вы однозначно запросили разницу? Может ли пользователь экрана запроса указать NULL против blank, используя стандартный синтаксис формы ввода?

  5. на практике мне никогда не запрещали читать и писать данные, используя по умолчанию, неудивительное поведение, используя это правило. Если мне нужно было узнать разницу, я использовал логическое поле (которое легче сопоставить с однозначными устройствами пользовательского интерфейса). В одном случае я использовал триггер для обеспечения True => значение null, но никогда не видел его вызванным, потому что слой BR эффективно отфильтровал условие.


если пользователь предоставляет пустую строку, я всегда рассматриваю ее как null с точки зрения базы данных. Кроме того, я обычно обрезаю строковые входы, чтобы удалить ведущие/конечные пробелы, а затем проверяю пустые. Это небольшая победа в базе данных с типами varchar (), а также уменьшает случаи поиска, так как мне нужно только проверить name is null вместо name is null or name = '' вы также можете пойти другим путем, Преобразуя null в ". В любом случае, выбирайте путь и будьте последовательны.


Что вам нужно сделать, это выяснить, что поведение вы хотите. Нет ни одной фиксированной алгебры того, как интерпретируются строки имен.

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

NULL → неинициализированный
""→ целенаправленно unset
имя → инициализировано.


Я стараюсь, чтобы все было просто. В этом случае я бы сделал столбец с именем not-nullable и разрешил пробелы. В противном случае вам придется иметь дело с тремя случаями в любом месте, где вы ссылаетесь на это поле:

  1. пустое имя
  2. Null имя
  3. непустое имя

Если вы идете с "пустой-это null" или "null-это пусто", то вы до двух случаев. Два дела лучше, чем три.

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


хотя ваш пример в основном для строк, я хотел бы сказать, что я использую null для числовых и булевых полей. Баланс учетной записи 0 очень отличается от меня как нулевой. То же самое для логических, если люди принимают тест с множественным выбором с истинными и ложными ответами, очень важно знать, ответил ли кто-то истинно или ложно или не ответил Вообще. Не использование null в этих случаях потребует от меня дополнительной таблицы или другой настройки, чтобы увидеть, ответил ли кто-то на вопрос. Вы можете использовать, например, -1 для не заполненного 0 для false и 1 для true, но тогда вы используете числовое поле для чего-то, что по существу является логическим.


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


Я всегда использовал NULL для неинициализированных значений,empty специально для пустых значений и 0 для выключения индикаторов.

делая это все время, он есть, даже если я не использую его, но мне не нужно делать ничего другого, если мне нужно это различие.

я обычно тестирую для empty(), но иногда я проверяю isset(), который оценивает false on NULL. Это полезно для напоминаний, чтобы ответить на определенные вопросы. Если это empty, false или 0 тогда ответ на вопрос.