Путаница с использованием логических операторов в MySql

0

У меня есть таблица, называемая users как показано ниже:

Изображение 174551

Теперь, когда я запускаю запрос как:

select * from users where name='admin1' AND 1;

Я получаю как вывод только запись admin1 как показано ниже: Изображение 174551

Хотя с запросом:

select * from users where name='admin1' OR 1;

Я получаю как вывод всех записей, как показано ниже: Изображение 174551

Я пытаюсь понять, почему это происходит. ИМХО, если мы говорим об оценке логического выражения, оба вышеуказанных запроса оценивают до 1, поскольку оба они

1 И 1

а также

1 ИЛИ 1

Так почему это различие? Или есть что-то фундаментальное, что мне, возможно, не хватает?

  • 6
    «<x> И 1» возвращает значение «<x>», которое может быть либо истинным, либо ложным. «<x> ИЛИ 1» всегда возвращает true, потому что «1» всегда true.
  • 2
    Обычно вы не должны размещать хэши паролей на общедоступном форуме. Но поскольку эти хэши с паролем меча выглядят как фишка, их нельзя взломать с помощью радужных таблиц, и это ваша удача
Показать ещё 3 комментария
Теги:
query-optimization
sql-injection

2 ответа

2

Просто чтобы добавить к ответу @DanoPlurana, я считаю правильным.

Я бы категорически отказался писать запросы таким образом, поскольку они не соответствуют стандарту SQL, и их трудно читать. Если вы запутались в их значении, я готов поспорить, что следующий разработчик (разработчики), которые прочитают его после вас, также будут обслуживаться. И это создает реальные дефекты в производстве и реальную потерю денег для ваших клиентов.

Просто напишите нормальные булевские условия и сделайте жизнь проще для всех.

1

Он работает нормально. Первый запрос должен удовлетворять обоим условиям, поэтому имя должно быть "admin1", а 1 всегда истинно. Вот почему вы получаете только одну строку в результате с именем admin1

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

Изображение 174551

  • 1
    (NOT - унарный оператор. На рисунке показано NOT ( A OR B ) .)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню