У меня установлен MySQL локально, при запуске SELECT VERSION()
возвращает это значение: 5.6.43-84.3
Когда я запускаю запрос, он возвращает несколько строк, когда он должен возвращать только 1 строку. Позвольте мне настроить его, так проще объяснить.
- Создать тестовую таблицу:
CREATE TABLE test_table
(
test_val VARCHAR(255)
)
;
- Загрузить 3 значения в таблицу:
INSERT INTO test_table (test_val)
VALUES
('9671986020630615'),
('9671986020630616'),
('9671986020630617')
;
Выполнить этот запрос (этот запрос возвращает 1 ожидаемую строку):
SELECT *
FROM
test_table
WHERE
test_val = '9671986020630615'
;
Выполнить этот запрос (этот запрос возвращает 3 строки, чего не должно быть):
SELECT *
FROM
test_table
WHERE
test_val = 9671986020630615
;
Вот что я наблюдал в этой ситуации:
- Первый запрос окружает значение в предложении
WHERE
одинарными кавычками.
- Второй запрос не окружает значение в предложении
WHERE
одиночными галочками.
- Столбец в тестовой таблице определен как
VARCHAR(255)
- Имеет смысл, что первый запрос возвращает только одну строку, потому что он сравнивает строку из предложения
WHERE
со значением строки в тестовой таблице (VARCHAR(255)
)
- Что-то происходит, когда MySQL сравнивает числовое значение в предложении
WHERE
второго запроса со строковым значением в тестовой таблице (VARCHAR(255)
), из-за чего MySQL возвращает 3 строки вместо просто 1.
Имеет смысл, что первый запрос возвращает правильный результат, потому что он сравнивает строку со строкой.
Также имеет смысл, что второй запрос возвращает неверный набор данных (3 строки в отличие от 1 строки, которую он должен вернуть).
Но мой вопрос , почему MySQL делает это? Почему, когда он сравнивает число с 3 различными значениями VARCHAR(255)
, он возвращает все 3 строки, когда истинное значение числового значения в предложении WHERE
соответствует только 1 строке?
Итак, по сути, для первого запроса MySQL говорит:
'9671986020630615' = '9671986020630615',
9671986020630615 <9671986020630616, </p>
'9671986020630615' <> '9671986020630617'
но для второго запроса он говорит:
9671986020630615 = '9671986020630615',
9671986020630615 = '9671986020630616',
9671986020630615 = '9671986020630617'
Любая помощь будет высоко ценится.