Поиск по текстовому полю с кавычками и без

Имеется таблица c текстовым полем code в котором содержаться уникальные значения (код товара)

CREATE TABLE t1 (
    `id` INT(9) UNSIGNED NOT NULL AUTO_INCREMENT,   
    `code` MEDIUMTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
    ...
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE INDEX `code` (`code`(64)) USING BTREE,
    ...
)
COLLATE='utf8mb4_general_ci' ENGINE=InnoDB;

Если делать поиск с кавычками

SELECT * FROM t1 WHERE code = "123123";

, то возвращается одна запись со значением в поле code "123123".

Если же делать поиск без кавычек

SELECT * FROM t1 WHERE code = 123123;

То может возвращаться более одной записи, например со значениями в поле code

"123123"
"123123/34"
"123123/3452"

Почему так происходит и какие преобразования типов задействуются?


Ответы (1 шт):

Автор решения: Akina

Type Conversion in Expression Evaluation

В первом случае, с кавычками, контекст поиска строковый, во втором, без кавычек, числовой. Если предположить, что в вопросе опечатка, и отбор выполняется не по полю id, а по полю code, то соответственно при сравнении строкового поля и числового критерия строковое значение поля приводится к числовому типу, при этом всё после первого не-числового символа отбрасывается.

PS. Используйте для обрамления строковых литералов не двойную, а одинарную кавычку. Двойные кавычки используйте только в JSON. Помните, что при включённом ANSI_QUOTES SQL Mode значение в двойных кавычках будет интерпретировано как имя поля, что приведёт к ошибке.

→ Ссылка