我创建以 id 作为主键和 int 自动增量的表:
用这个脚本
CREATE TABLE `devel_pos`.`menu` ( `id` INT NOT NULL AUTO_INCREMENT , `title` VARCHAR(100) NULL DEFAULT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;
INSERT INTO menu (title) VALUES ('Menu-1'),('Menu-2'),('Menu-3'),('Menu-4'),('Menu-5');
然后查询一些数据,其中id='1'
select * from menu where id = '1'
当然它返回包含相关数据的行 [1,'Menu-1']
然后再次查询一些数据,其中 id ='1a'它返回与第一行相同的行 [1, 'Menu-1']
select * from menu where id = '1b'
为什么会出现这样的情况呢?
MySQL 8.0 参考手册 / 函数和运算符 / 表达式求值中的类型转换 https://dev.mysql.com/doc/refman/8.0/en/type-conversion.html(未找到 MariaDB 的文章)
以下规则描述了如何进行转换以进行比较
运营:
-
如果一个或两个参数为 NULL,则比较结果为 NULL,NULL 安全 相等比较运算符除外。为了
NULL NULL,结果为真。无需转换。
-
如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。
-
如果两个参数都是整数,则将它们作为整数进行比较。
-
如果不与数字进行比较,十六进制值将被视为二进制字符串。
-
如果参数之一是 TIMESTAMP 或 DATETIME 列,另一个参数是常量,则该常量将转换为时间戳
在进行比较之前。这样做是为了更
ODBC 友好。对于 IN() 的参数没有这样做。为了安全起见,
执行时始终使用完整的日期时间、日期或时间字符串
比较。例如,要在使用 BETWEEN 时获得最佳结果
对于日期或时间值,使用 CAST() 显式转换值
到所需的数据类型。
-
来自一个或多个表的单行子查询不被视为常量。例如,如果子查询返回要比较的整数
对于 DATETIME 值,比较是作为两个整数进行的。这
整数不会转换为时间值。比较操作数
作为 DATETIME 值,使用 CAST() 显式转换子查询
值到 DATETIME。
-
如果其中一个参数是十进制值,则比较取决于另一个参数。参数将作为十进制值进行比较,如果
另一个参数是十进制或整数值,或浮点值
值(如果另一个参数是浮点值)。
-
在所有其他情况下,参数将作为浮点数(实数)进行比较。例如,字符串和数字的比较
操作数作为浮点数的比较进行。
您比较整数列和字符串文字。最后一条规则适用于本例。'1'
, '1a'
and '1b'
被转换为数字1
在这种情况下,以及行id=1
被选中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)