Я прочитал статью на BBC. Один из примеров, по их словам, заключается в том, что у людей с фамилией «Нуль» возникают проблемы с вводом своих данных на некоторых веб-сайтах.
Нет объяснения по поводу ошибки, с которой они сталкиваются.
Но, насколько мне известно, строка 'Null' и фактическое значение Null совершенно разные (с точки зрения базы данных).
Почему это может вызвать проблемы в базе данных?
Ответы:
Это не вызывает проблем с базой данных. Это вызывает проблемы в приложениях, написанных разработчиками, которые не понимают базы данных. Корень проблемы в том, что многие программы, связанные с базой данных, отображают NULL-запись в виде строки
NULL
. Когда приложение затем использует строковую форму записи NULL (вероятно, также с использованием операций сравнения без учета регистра), то такое приложение будет считать любую"null"
строку NULL. Следовательно, имя Null будет считаться не существующим в этом приложении.Решение состоит в том, чтобы объявить ненулевые столбцы, как
NOT NULL
в базе данных, и не применять строковые операции к записям базы данных. Большинство языков имеют отличные API-интерфейсы базы данных, которые делают ненужными интерфейсы на уровне строк. Им всегда следует отдавать предпочтение, также потому что они делают другие ошибки, такие как внедрение SQL, менее вероятными.источник
NOT NULL
вызовет целый ряд проблем для других людей. «У некоторых людей есть только одно имя, а не имя и фамилия».Чтобы ответить на ваш конкретный вопрос, есть много шагов по цепочке событий между веб-формой и базой данных. Если фамилия
Null
ошибочно интерпретируется какNULL
значение, то система может отклонить совершенно правильное имя как недействительное. Это может происходить на уровне базы данных, как объяснил amon . Между прочим, если это конкретная проблема, то база данных также, вероятно, открыта для SQL-инъекции, также как атака таблиц Бобби . Другим шагом в цепочке, который может вызвать проблемы, является процесс сериализации .В целом статья была о большей проблеме. Мир - это большое грязное место, которое не всегда соответствует нашим предположениям. Это особенно очевидно, когда вы пытаетесь интернационализировать ваше приложение. В конце дня мы должны убедиться, что наши приложения обрабатывают и кодируют наши данные должным образом . Именно бизнес решает, сколько ресурсов мы выделим на поддержку все более сложных крайних случаев. Хотя я полностью поддерживаю участие, я пойму, решит ли компания, что «артисту, формально известному как Принц» необходимо использовать символ Unicode для представления своего имени в нашей базе данных.
источник
INSERT INTO users (first, last) VALUES($first, $last)
оценитеINSERT INTO users (first, last) VALUES(Jennifer, Null)
), то все, чьи имена не являются допустимыми ключевыми словами или именами столбцов SQL, просто будут выдавать ошибки и не вставлять свои записи. Причина должна быть более сложной.Ну, прежде чем войти в базу данных, это элемент DOM, затем передаваемая, проверяемая и манипулируемая переменная javascript, затем значение JSON, затем переменная в любой используемой вами серверной библиотеке JSON, а затем переменная, передаваемая вокруг, проверяется и обрабатывается на вашем внутреннем языке программирования, затем элемент некоторого типа DAO, а затем часть строки SQL. Затем, чтобы получить значение обратно, вы делаете все наоборот. Программисты могут совершать ошибки очень часто, и, как правило, в большинстве случаев без статической типизации.
источник
Скорее всего, это проблема программирования. Если вы посмотрите на этот ответ о том, как передаются значения 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, поскольку между разными поставщиками будут различия.
источник
Я бы объяснил эту проблему небрежным программированием и плохим дизайном некоторых реализаций SQL. «Нулевое» имя всегда должно быть представлено и интерпретировано с кавычками. null, значение базы данных, всегда должно быть представлено без кавычек; но при написании специального кода легко проскользнуть в парадигму «что угодно» и принять то, что считается строкой в не заключенной в кавычки форме.
Это усугубляется тем, что другие типы данных; числа, например, могут и принимаются в любой форме, потому что интерпретация однозначна.
источник
Проблема, по сути, заключается в том, что к термину «ноль» применяются две разные концепции базы данных, иногда с использованием контекста, чтобы различать их:
Хотя иногда бывает достаточно контекста, чтобы различать эти понятия, бывают случаи, когда его действительно нет. Если кто-то использует запись для хранения поискового запроса, например, должна быть разница между высказыванием «Я хочу кого-то по имени [что угодно], без фамилии», и «Я хочу, чтобы кто-то по имени [ что угодно], но чья фамилия неизвестна ". Многие движки баз данных имеют тенденцию к тому или иному значению, но они не одинаковы. Код, который ожидает, что ядро базы данных будет работать в одном направлении, может работать неправильно, если он работает на другом движке, который работает по-другому.
источник
Большинство существующих ответов сосредоточены на не-SQL-частях приложения, но в SQL также может быть проблема:
Если получено указание отфильтровать записи, в которых фамилия пользователя недоступна, тот, кто не очень хорошо понимает SQL, может написать фильтр
WHERE u.lastname != 'NULL'
. Из-за того, как работает SQL, будет отображаться проверка того,u.lastname IS NOT NULL
все лиNULL
записи отфильтрованы. Все незарегистрированныеNULL
записи остаются.За исключением, конечно, для записей, где
u.lastname == 'NULL'
, но, возможно, не было таких записей, доступных во время тестирования.Это становится более вероятным, если SQL генерируется какой-то платформой, где эта инфраструктура не предоставляет легкодоступного способа проверки
NULL
ненульности с параметрами, и кто-то замечает: «эй, если я передам строкуNULL
, делает именно то, что я хочу!источник