То, что вы видите, называется неявное преобразование . Поскольку вы просите MySQL сравнить строку с целым числом, она переводит строку в число, а затем сравнивает результат.
И получается, что в MySQL любая строка, которая не начинается с ди git преобразуется в 0
. Это соответствует вашему предикату where
, отсюда и результаты, которые вы видите.
Общее правило: не полагайтесь на неявное приведение; при передаче литеральных значений в ваших запросах, используйте правильный тип данных (здесь 0
должно быть '0'
). При сравнении столбцов таблицы выполняйте приведение по мере необходимости.
Вот небольшая демонстрация 1014 * сравнений int / string.
select
'foo' = '0', -- false (as expected)
'foo' = 0, -- true!
'0foo' = 0 -- true ("0foo" starts with "0")
'foo' = '0' | 'foo' = 0 | '0foo' = 0
----------: | --------: | ---------:
0 | 1 | 1