MySQL выбирает, где столбец является ложным

#php #mysql

#php #mysql

Вопрос:

Как выбрать, где столбец эквивалентен false в PHP (например, когда в php !$myVar вычисляется значение true).

Пока у меня есть:

 SELECT * from users 
WHERE firstname = '0' 
   OR firstname = ''
   OR firstname IS NULL;
  

Я думаю, что это покрывает большую часть ошибок php, но тогда остается основная проблема… как насчет любого количества пробелов? Нужно ли мне теперь выполнять какую-то проверку регулярных выражений для s , например. И какие выше символы табуляции или новой строки. Или есть более простой способ справиться со всем этим?

Редактировать:

тип данных столбца — char(32)

Комментарии:

1. Строка с пробелами должна оцениваться как true в PHP.

2. То, что PHP считает ложным, четко задокументировано: php.net/manual/en/language.types.boolean.php . строка с любым ненулевым количеством пробелов НЕ является false.

3. хммм, спасибо за комментарии, верно, основываясь на документах, мне просто нужно добавить проверку на FALSE , но, конечно, тип данных столбца не является логическим, это char (32), так что проверять это не нужно. Как насчет строки ‘0.00’ или ‘00000000000000’. Думаю, я пока продолжу расследование.

Ответ №1:

Пробелы будут учитываться как нечто в этом случае, и все специальные символы, такие как перевод строки, также будут учитываться. Они не считаются ложными. Реальный вопрос заключается в том, почему вы решили хранить вещи таким образом в MySQL. Обычный способ сохранить логическое значение в MySQL — использовать 0 или 1. Это обеспечивает согласованность и означает, что вам не придется делать что-то подобное для всех запросов.

Ваш запрос будет работать, однако firstname = NULL также допустимо.

Ответ №2:

Провел еще некоторое расследование. http://php.net/manual/en/language.types.boolean.php это хорошее место для начала. Проверьте, не содержится ли в данных того, что, как вы знаете, может считаться false.

Однако я хотел бы надеяться, что это просто для целей очистки данных. Создание архитектуры, требующей от вас запроса того, что PHP считает false, кажется действительно плохой идеей… Просто посмотрите на эти результаты теста.

Я вставил в таблицу MySQL следующее, а затем запросил базу данных с помощью PHP и проверил, был ли результат признан ложным или нет:

Рассмотрено FALSE

 INSERT into confirm (data) VALUES ('0');
INSERT into confirm (data) VALUES (00);
INSERT into confirm (data) VALUES (000);
INSERT into confirm (data) VALUES ('');
INSERT into confirm (data) VALUES (null);
INSERT into confirm (data) VALUES ('  ');
INSERT into confirm (data) VALUES ('   ');
INSERT into confirm (data) VALUES ('    '); #tab character
  

Рассмотрено TRUE

 INSERT into confirm (data) VALUES ('0.00');
INSERT into confirm (data) VALUES ('0.000');
INSERT into confirm (data) VALUES (0.0);
INSERT into confirm (data) VALUES (0.00);
INSERT into confirm (data) VALUES (0.000);
INSERT into confirm (data) VALUES ('00');
INSERT into confirm (data) VALUES ('false');
INSERT into confirm (data) VALUES ('null');
INSERT into confirm (data) VALUES ('[]');
INSERT into confirm (data) VALUES ('array');
INSERT into confirm (data) VALUES ('array()');
  

Обратите внимание, что при вставке нескольких пробелов в MySQL, он преобразует его в пустую «строку. Символ табуляции остается (но выглядит как пробел).

Сам факт, что у вас могут быть символы табуляции или другие разные пробелы, которые PHP считает ложными, говорит мне о том, что было бы сложно создать запрос, который охватывает все возможности.

tldr: Вашим единственным реалистичным вариантом было бы выбрать все и проверить в вашем скрипте, является ли это false или нет.