Если человека зовут Null, то как он сломает базу данных?

55

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

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

Может ли кто-нибудь объяснить технические детали, когда возникнет такая ситуация? Проверка формы просто делает string == NULLили что-то? Даже так я не думаю NULL is same as "NULL".

Сурадип Нанда
источник
32
Статья была явно написана журналистом. Нули являются причиной многих недоразумений, вы не ожидаете, что журналист будет менее смущен.
ypercubeᵀᴹ
2
Все: комментарии со ссылками на связанные вопросы или статьи были перемещены в ответ вики-сообщества ниже. Пожалуйста, отредактируйте (или предложите отредактировать) этот ответ вместо добавления дополнительных ссылок на этой странице.
Пол Уайт

Ответы:

42

Я видел интерфейсы базы данных (например, библиотеки фреймворков), которые возвращают 'null' как строку для нулевых столбцов. Я полагаю, что был флаг, который включал бы или выключал это для отладки. Этот флаг позволяет разработчикам легко определить, было ли пустое поле результатом нулевого или пустого значения. Это плохая настройка, особенно на производстве, которая объясняет проблемы, описанные в статье.

Обратная обработка преобразования 'null' в нулевое значение должна генерировать ошибку приложения для поля имени. Я ожидаю, что это будет довольно быстро решено.

BillThor
источник
Действительно - это довольно часто встречается в средах для нетипизированных языков, где все данные преобразуются в строку. Прошло несколько лет с тех пор, как я работал над этим, но я считаю, что ранние версии ColdFusion имели эту проблему, например.
Жюль
25

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

Вероятно, некоторые из этих проблем вызваны на уровне приложений, а не API БД. Магические ценности - это антишаблон, который нелепо вытеснить из индустрии. Очень легко какой-то программист мог бы написать условие по типу «кто-то набрал« ноль »? Они должны означать, что нет значения, потому что это то, что означает нуль!» Неправильная попытка предотвратить внедрение SQL-кода также может быть причиной упомянутого неправильного обращения с Null или гавайской фамилией, содержащей одинарную кавычку, которая также является стандартным разделителем строк SQL.

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

Эзотерическое имя
источник
5
Я не знал, что О'Брайан был гавайцем.
glglgl
19

Сама статья содержит ссылку на вопрос переполнения стека, который демонстрирует проблему; это было в приложении Flex, где код:

currentChild.appendChild("Fred");

добавит элемент, содержащий слово, Fredв документ XML, но код:

currentChild.appendChild("null");

добавит пустой элемент, а не элемент, содержащий текст «null».

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

Dour High Arch
источник
13

Я не упомянул одну вещь, о которой упомянул: мы говорим не только о SQL.

Имя может начинаться / заканчиваться в базе данных ... но для этого обычно используются НЕСКОЛЬКО каналов. База данных, Sql, php, html, javascript ... Java, C #, VB, Perl, Phython, Ruby, bash, batch и т. Д. И т. Д. И т. Д. И т. Д.

Каждый из этих шагов в конвейере может включать преобразование данных из одного формата в другой. Из таблиц Sql, JSON, XML, CSV и т. Д ...

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

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

WernerCD
источник
8

Сообщество Wiki ответит на различные ссылки, изначально оставленные в качестве комментариев к этому популярному вопросу

Пол Уайт
источник
4

Реляционные базы данных должны учитывать отсутствующие или нерелевантные значения. Например, список клиентов может включать номер мобильного телефона или пол. Что, если корпорация хочет стать клиентом - какого пола она должна иметь?

Специальный индикатор используется, чтобы показать, что значение отсутствует. Этот специальный флаг имеет значение NULL. Таким образом, неаккуратное программирование может привести к тому, что индикатор отсутствующего значения - NULL - будет перепутан с фамилией Дженнифер Налл, возможно, интерпретируя ее фамилию как пропущенные данные, а не фактическое значение.

Это немного похоже на открытие банковского счета, но не внесение денег. Баланс равен нулю. Это не значит, что у вас нет баланса. Это означает, что у вас есть баланс, и его значение равно «0». Но неаккуратное программирование может неверно истолковать ноль как «не существует» и определить, что у вас вообще нет учетной записи.

Майкл Грин
источник
2

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

Но давайте не будем забывать человеческий фактор: возможно, люди видят имя на экранах и распечатках и думают, что это ошибка, а удаление человека - еще одна вероятная причина?

MGOwen
источник