2013-07-25 3 views
2

Почему MySQL запрос всегда возвращает все данные столбца из таблицы ?:Запрос всегда возвращает все данные

SELECT column 
    FROM table 
WHERE column = "+" 

Тип столбца VARCHAR.

+0

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

+0

SELECT '' + '' возвращает 0 –

+0

возможный дубликат [Почему это результат \ 'select 'a' = 0; \' 1?] (Http://stackoverflow.com/questions/4300120/why-is- the-result-of-select-a-0-1) –

ответ

1

Ok, после уточнения вашего запроса, это немного яснее, что произошло. В MySQL + является только числовым оператором, а не оператором конкатенации. Нечисловые строки всегда будут сбрасываться до нуля, поэтому, если вы попытаетесь «добавить» вместе две пустые строки (пары одинарных кавычек), вы эффективно выбираете 0 + 0.

MySQL> SELECT 1 + 1, '' + '', '1abc' + 1; 
+-------+---------+------------+ 
| 1 + 1 | '' + '' | '1abc' + 1 | 
+-------+---------+------------+ 
|  2 |  0 |   2 | 
+-------+---------+------------+ 
1 row in set, 1 warning (0.00 sec) 

И так нечисловых строк, поданных к нулю, любой не-цифровая строка в столбце будет соответствовать условию эффективно

WHERE column = 0 

Пример сравнения нуля до числового и нечисловой строки:

MySQL> SELECT 'abcd' = 0, '1234' = 0; 
+------------+------------+ 
| 'abcd' = 0 | '1234' = 0 | 
+------------+------------+ 
|   1 |   0 | 
+------------+------------+ 
1 row in set, 1 warning (0.00 sec) 
+0

Да, я уже понимаю, но почему MySQL возвращает все данные столбца, если нет согласованных значений? –

+0

@IgorKhromov Нет, он не возвращает все, если ни один не сопоставляется. Дело в том, что _all strings_, которые не являются числовыми, будут вычисляться до 0 при наборе в виде целых чисел. Когда вы сравниваете целое число «0» в предложении 'WHERE', все они отливаются от целых чисел, и все соответствуют 0. Если в вашем столбце были строки, такие как' 1a', они должны были бы отличить их от правильных целочисленных значений и _not_ совпадают с нулем. –

+0

Спасибо, теперь все понятно! –

1

Поскольку вы сравниваете с 0 (целое число), значение столбца преобразуется в целое число перед сравнением. Все эти значения будут содержать 0, если они не содержат строку, которая может быть указана на другое целочисленное значение (например, '1').

Чтобы решить эту проблему, попробуйте:

WHERE column = '0' 
+0

спасибо, я понимаю, что он не может сравните INT и VARCHAR, а column = 0 всегда TRUE. Спасибо всем, ребята !!! –

0

MySql на сравнении VARCHAR с целым числом, пытается бросить VARCHAR в целое число. И если строка не является числом, она по умолчанию добавляется в целое число 0 и, следовательно, возвращает true при сравнении с 0. Если бы был столбец, например, «123», он не был бы выбран.

Смежные вопросы