MySQL возвращает все строки, когда поле = 0

Я делал некоторые тесты, и это было неожиданностью, когда я запрашивал таблицу, а запрос SELECT * FROM table WHERE email=0 возвращал все строки из таблицы.

В этой таблице нет значений "0", и она заполняется регулярными сообщениями электронной почты.

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

Есть ли способ избежать этого без изменения запроса?

Мне что-то не хватает?

Спасибо.

Ответы

Ответ 1

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

SELECT * FROM table WHERE email='0';

Ответ 2

Ваш столбец email - это тип CHAR или VARCHAR. Когда вы используете условие email = 0, MySQL отличает содержимое столбца email к целому числу, чтобы сравнить их с предоставленным вами 0. Если бы вы окружили свои 0 в кавычках, запрос работал бы так, как ожидалось. (email = '0')

Преобразование нечисловой строки в целое число в MySQL приведет к 0.

mysql> SELECT CAST('[email protected]' AS SIGNED);
+-------------------------------------+
| CAST('[email protected]' AS SIGNED) |
+-------------------------------------+
|                                   0 |
+-------------------------------------+

В отличие от этого, если вы попытались сделать то же самое с числовыми строками, они могут корректно выполнить:

mysql> SELECT CAST('12345' AS SIGNED);
+-------------------------+
| CAST('12345' AS SIGNED) |
+-------------------------+
|                   12345 |
+-------------------------+

Ответ 3

Поле электронной почты, вероятно, является символом, и вы соответствуете числовым значениям.

Попробуйте,

SELECT * FROM table WHERE email='0';

Ответ 4

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

SELECT * FROM table WHERE email IS NOT NULL;