Запрос строки в поле int возвращает все строки, содержащие 0 в этом поле - PullRequest
0 голосов
/ 28 июня 2019

Я делаю простой поиск по всем полям таблицы, но когда я запрашиваю целочисленное поле, он возвращает мне все строки, в которых есть 0. Что для меня странно, так это то, что этого не происходит с полем id, которое ничего не извлекает в случае, если это слово (ожидаемое поведение).

SELECT * FROM seats WHERE number = "2" - this works
SELECT * FROM seats WHERE number = "hello" - this brings all the zeros
SELECT * FROM seats WHERE id = "hello" - this brings nothing

Почему это происходит?

Ответы [ 2 ]

1 голос
/ 29 июня 2019

Столбец number имеет тип данных int, поэтому:

WHERE number = "2"

эквивалентно:

WHERE number = 2

, поскольку MySql неявно преобразует "2" в 2, чтобы соответствовать типу данных number.Поскольку преобразование преобразует строку в число, которое она представляет, вы говорите, что работает .Но здесь:

WHERE number = "hello"

попытка сделать int из "hello" приводит к 0, так что это эквивалентно:

WHERE number = 0

, и вы видите, чтоэто это приносит все нули .
Теперь в случае id, если его тип данных равен varchar, то здесь:

WHERE id = "hello"

преобразование не выполняется и потому что id со значением "hello" не существует это ничего не приносит .Если тип данных id равен int, то снова он эквивалентен:

WHERE id = 0

, и я думаю, что id со значением 0 не существует, поэтому это ничего не дает.Все это объясняется здесь: Преобразование типов в оценке выражений

1 голос
/ 29 июня 2019

Вы смешиваете типы данных.MySQL выполняет автоматическое преобразование строк в числа, преобразовывая первые цифры в число.Таким образом, '2' преобразуется в 2.Как и 2million.

Если нет начальных цифр, то значение преобразуется в 0.

Мораль?Не смешивайте типы данных.Используйте соответствующий тип данных для сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...