MariaDb 10 条件(其中 id = '1')返回与 id ='1a' 相同的结果

2024-04-18

我创建以 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(使用前将#替换为@)

MariaDb 10 条件(其中 id = '1')返回与 id ='1a' 相同的结果 的相关文章

随机推荐