2013-12-04 3 views
1

У меня есть запрос, похожий на один ниже. Запрос должен запрашивать записи в example, где value равен 3. Сравнительный пример: value = '3 value', где я ожидал бы value = 3.Неверный запрос с правильным результатом

Зачем нужны результаты value = '3 value' в тех же учетных документах, что и value = 3?

SELECT 
    * 
FROM 
    test.example 
WHERE 
    value = '3 value'; 

value имеет тип INT и я бы ожидать, чтобы получить ошибку или, по крайней мере, неправильный результат. Хотя, я получаю правильный результат (в зависимости от того, как вы определяете «право») (результат, когда значение равно 3).

Данные в таблице (ID, имя, значение):

1 Example 1 1 
2 Example 2 2 
3 Example 3 3 
4 Example 4 3 
5 Example 5 2 

ответ

5

От doc

Когда оператор используется с операндами различных типов, преобразование типа происходит, чтобы сделать операнды совместимы , Некоторые преобразования происходят неявно. Например, MySQL автоматически преобразует числа в строки по необходимости, и наоборот.

затем

select "3 value" = 3 

возвращает 1, потому что

select CAST("3 value" AS SIGNED) 

возвращается 3

0

Если вы проверили предупреждения, выдаваемые по запросу, вы видите что-то следующим образом:

+---------+------+---------------------------------------------+ 
| Level | Code | Message          | 
+---------+------+---------------------------------------------+ 
| Warning | 1292 | Truncated incorrect DOUBLE value: '3 value' | 
+---------+------+---------------------------------------------+ 

MySQL усекает значение, оставляя только целое число.

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