Поиск по текстовому полю с кавычками и без
Имеется таблица 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 шт):
Type Conversion in Expression Evaluation
В первом случае, с кавычками, контекст поиска строковый, во втором, без кавычек, числовой. Если предположить, что в вопросе опечатка, и отбор выполняется не по полю id, а по полю code, то соответственно при сравнении строкового поля и числового критерия строковое значение поля приводится к числовому типу, при этом всё после первого не-числового символа отбрасывается.
PS. Используйте для обрамления строковых литералов не двойную, а одинарную кавычку. Двойные кавычки используйте только в JSON. Помните, что при включённом ANSI_QUOTES SQL Mode значение в двойных кавычках будет интерпретировано как имя поля, что приведёт к ошибке.