Как фамилия Null вызывает проблемы во многих базах данных?

71

Я прочитал статью на BBC. Один из примеров, по их словам, заключается в том, что у людей с фамилией «Нуль» возникают проблемы с вводом своих данных на некоторых веб-сайтах.

Нет объяснения по поводу ошибки, с которой они сталкиваются.

Но, насколько мне известно, строка 'Null' и фактическое значение Null совершенно разные (с точки зрения базы данных).

Почему это может вызвать проблемы в базе данных?

Nitish
источник
2
Это довольно известная статья в блоге об предположениях, которые программисты делают относительно имен, написанная одним из людей, цитируемых в этой статье BBC: kalzumeus.com/2010/06/17/…
Jörg W Mittag
12
Соответствующий xkcd
Восстановить Монику
2
Смотрите также: stackoverflow.com/questions/4456438/…
Foon
4
Когда я впервые увидел этого парня по телевизору, я предположил, что это ошибка базы данных. Тогда я узнал, что это на самом деле его имя.
Нейт Элдридж
3
@JarrodRoberson Как вы можете сказать, что «вся предпосылка ложна», учитывая описание проблем, с которыми сталкивается «Дженнифер Налл», и аналогичное имя в ссылке, опубликованной ОП? Это реальная проблема, с которой сталкиваются настоящие конечные пользователи.
Gort the Robot

Ответы:

102

Это не вызывает проблем с базой данных. Это вызывает проблемы в приложениях, написанных разработчиками, которые не понимают базы данных. Корень проблемы в том, что многие программы, связанные с базой данных, отображают NULL-запись в виде строки NULL. Когда приложение затем использует строковую форму записи NULL (вероятно, также с использованием операций сравнения без учета регистра), то такое приложение будет считать любую "null"строку NULL. Следовательно, имя Null будет считаться не существующим в этом приложении.

Решение состоит в том, чтобы объявить ненулевые столбцы, как NOT NULLв базе данных, и не применять строковые операции к записям базы данных. Большинство языков имеют отличные API-интерфейсы базы данных, которые делают ненужными интерфейсы на уровне строк. Им всегда следует отдавать предпочтение, также потому что они делают другие ошибки, такие как внедрение SQL, менее вероятными.

Амон
источник
30
В этом случае, однако, если вы прочитаете данную статью, внесение поля фамилии NOT NULLвызовет целый ряд проблем для других людей. «У некоторых людей есть только одно имя, а не имя и фамилия».
MikeTheLiar
41
@Darkhogg Многие люди не согласны со мной по этому поводу, но я думаю, что имена похожи на адреса электронной почты - не беспокойтесь о проверке их, предоставьте пользователю одно текстовое поле и позвольте ему поместить все, что он хочет. Это информация о том, что, если мне это действительно нужно, я получу ее от вас таким способом, который, несомненно, будет правильным.
MikeTheLiar
8
@mikeTheLiar Я не знаю, как это называется, но существует целый класс ошибок, возникающих при создании чрезмерно ограничительных правил для данных. Часто в приложениях и базах данных вы увидите почтовые коды и номера телефонов, определенные как числовые. Они на самом деле не числа, потому что нет смысла делать с ними математические операции. Поэтому, когда кто-то пытается ввести канадский адрес, он застревает.
JimmyJames
19
@JimmyJames да, почтовые индексы хранятся в виде чисел, и внезапно любой, кто живет здесь, имеет почтовый индекс с номером 8. «Если вы не занимаетесь математикой, это строка, полная остановка».
MikeTheLiar
8
@mikeTheLiar. Проблема с именами как с одной строкой (обычно предпочтительнее, я согласен) заключается в том, что существует необходимость сортировки по фамилии в алфавитном порядке.
TRiG
13

Чтобы ответить на ваш конкретный вопрос, есть много шагов по цепочке событий между веб-формой и базой данных. Если фамилия Nullошибочно интерпретируется как NULLзначение, то система может отклонить совершенно правильное имя как недействительное. Это может происходить на уровне базы данных, как объяснил amon . Между прочим, если это конкретная проблема, то база данных также, вероятно, открыта для SQL-инъекции, также как атака таблиц Бобби . Другим шагом в цепочке, который может вызвать проблемы, является процесс сериализации .

В целом статья была о большей проблеме. Мир - это большое грязное место, которое не всегда соответствует нашим предположениям. Это особенно очевидно, когда вы пытаетесь интернационализировать ваше приложение. В конце дня мы должны убедиться, что наши приложения обрабатывают и кодируют наши данные должным образом . Именно бизнес решает, сколько ресурсов мы выделим на поддержку все более сложных крайних случаев. Хотя я полностью поддерживаю участие, я пойму, решит ли компания, что «артисту, формально известному как Принц» необходимо использовать символ Unicode для представления своего имени в нашей базе данных.

Erik
источник
Трудно представить, что это вызвано небезопасной интерполяцией строк, которая может привести к внедрению SQL. Если вы забудете процитировать пользовательский ввод в запросе SQL (например, INSERT INTO users (first, last) VALUES($first, $last)оцените INSERT INTO users (first, last) VALUES(Jennifer, Null)), то все, чьи имена не являются допустимыми ключевыми словами или именами столбцов SQL, просто будут выдавать ошибки и не вставлять свои записи. Причина должна быть более сложной.
Эндрю Медико
@AndrewMedico в вашем примере с соломой, да, но есть много способов сделать что-то не так. Никогда не стоит недооценивать силу невежества <strike> глупости <\ strike>. Суть в том, что мы не имеем ни малейшего представления, в чем именно заключается проблема, потому что мы не можем просмотреть рассматриваемый код
Эрик,
7

Ну, прежде чем войти в базу данных, это элемент DOM, затем передаваемая, проверяемая и манипулируемая переменная javascript, затем значение JSON, затем переменная в любой используемой вами серверной библиотеке JSON, а затем переменная, передаваемая вокруг, проверяется и обрабатывается на вашем внутреннем языке программирования, затем элемент некоторого типа DAO, а затем часть строки SQL. Затем, чтобы получить значение обратно, вы делаете все наоборот. Программисты могут совершать ошибки очень часто, и, как правило, в большинстве случаев без статической типизации.

Карл Билефельдт
источник
2

Скорее всего, это проблема программирования. Если вы посмотрите на этот ответ о том, как передаются значения NULL, вы можете легко вызвать нежелательное поведение, если бы вы были «Мистером Нулем».

https://stackoverflow.com/questions/4620391/mysql-and-php-insert-null-rather-than-empty-string

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

"NULL"! = База данных пуста

Некоторые варианты использования и связанное с этим поведение ...

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

Другой случай, скажем, фамилия была обнуляемой в базе данных. Мистер NULL вставляется и преобразуется в DBNull.Value, который не совпадает с «NULL». После вставки мы не можем найти мистера Нулла, потому что его фамилия не «НУЛЬ», а на самом деле пустое значение базы данных.

Таким образом, это будет 2 случая проблем. Как указывает @Amon, сами базы данных не имеют проблем с нулями, хотя нужно понимать, как обрабатываются нули в каждом экземпляре RDMS, поскольку между разными поставщиками будут различия.

Джон Рейнор
источник
«Вы можете видеть, что если какой-либо элемент данных был передан как NULL, данные будут интерполированы как нулевая база данных в базе данных». - связанный вопрос SO / принятый ответ, кажется, не показывает это?
MrWhite
2

Я бы объяснил эту проблему небрежным программированием и плохим дизайном некоторых реализаций SQL. «Нулевое» имя всегда должно быть представлено и интерпретировано с кавычками. null, значение базы данных, всегда должно быть представлено без кавычек; но при написании специального кода легко проскользнуть в парадигму «что угодно» и принять то, что считается строкой в ​​не заключенной в кавычки форме.

Это усугубляется тем, что другие типы данных; числа, например, могут и принимаются в любой форме, потому что интерпретация однозначна.

ddyer
источник
Вы имеете ввиду плохие реализации приложений, использующих SQL? Никакая серьезная реализация СУБД сама по себе не будет уязвима для этого (так же, как нет серьезного приложения!)
underscore_d
0

Проблема, по сути, заключается в том, что к термину «ноль» применяются две разные концепции базы данных, иногда с использованием контекста, чтобы различать их:

  1. Что-то не имеет известной ценности
  2. Что-то, как известно, не имеет значения

Хотя иногда бывает достаточно контекста, чтобы различать эти понятия, бывают случаи, когда его действительно нет. Если кто-то использует запись для хранения поискового запроса, например, должна быть разница между высказыванием «Я хочу кого-то по имени [что угодно], без фамилии», и «Я хочу, чтобы кто-то по имени [ что угодно], но чья фамилия неизвестна ". Многие движки баз данных имеют тенденцию к тому или иному значению, но они не одинаковы. Код, который ожидает, что ядро ​​базы данных будет работать в одном направлении, может работать неправильно, если он работает на другом движке, который работает по-другому.

Supercat
источник
Если известно, что строка не имеет значения, тогда это должна быть пустая строка, а не пустая строка.
Байрон Джонс
0

Большинство существующих ответов сосредоточены на не-SQL-частях приложения, но в SQL также может быть проблема:

Если получено указание отфильтровать записи, в которых фамилия пользователя недоступна, тот, кто не очень хорошо понимает SQL, может написать фильтр WHERE u.lastname != 'NULL'. Из-за того, как работает SQL, будет отображаться проверка того, u.lastname IS NOT NULLвсе ли NULLзаписи отфильтрованы. Все незарегистрированные NULLзаписи остаются.

За исключением, конечно, для записей, где u.lastname == 'NULL', но, возможно, не было таких записей, доступных во время тестирования.

Это становится более вероятным, если SQL генерируется какой-то платформой, где эта инфраструктура не предоставляет легкодоступного способа проверки NULLненульности с параметрами, и кто-то замечает: «эй, если я передам строку NULL, делает именно то, что я хочу!

HVD
источник