mySQL возвращает все строки, когда поле = 0 - PullRequest
18 голосов
/ 24 октября 2011

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

В этой таблице нет значений '0', и она заполнена обычными электронными письмами.

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

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

Я что-то здесь упускаю?

Спасибо.

Ответы [ 4 ]

23 голосов
/ 24 октября 2011

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

SELECT * FROM table WHERE email='0';
6 голосов
/ 24 октября 2011

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

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

mysql> SELECT CAST('email@example.com' AS SIGNED);
+-------------------------------------+
| CAST('email@example.com' AS SIGNED) |
+-------------------------------------+
|                                   0 |
+-------------------------------------+

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

mysql> SELECT CAST('12345' AS SIGNED);
+-------------------------+
| CAST('12345' AS SIGNED) |
+-------------------------+
|                   12345 |
+-------------------------+
3 голосов
/ 25 октября 2011

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

Попробуйте,

SELECT * FROM table WHERE email='0';
0 голосов
/ 24 октября 2011

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

SELECT * FROM table WHERE email IS NOT NULL;
...