有一个带有代码文本字段的表格,其中包含唯一值(产品代码)
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";
,则返回一条记录,其值为代码字段“123123”。
如果您进行不带引号的搜索
SELECT * FROM t1 WHERE code = 123123;
它可以返回多条记录,例如在代码字段中有值
"123123"
"123123/34"
"123123/3452"
为什么会发生这种情况以及涉及哪些类型转换?
表达式求值中的类型转换
在第一种情况下,使用引号,搜索上下文是字符串,在第二种情况下,没有引号,它是数字。如果我们假设问题中存在拼写错误,并且选择不是由 field 执行
id,而是由 field执行code,那么相应地,在比较字符串字段和数值标准时,将字段的字符串值转换为数字类型,而第一个非数字字符之后的所有内容都被丢弃。PS。使用单引号而不是双引号将字符串文字括起来。仅在 JSON 中使用双引号。请注意,启用 ANSI_QUOTES SQL 模式时,双引号中的值将被解释为字段名称,从而导致错误。