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;