MariaDB 10条件,其中id='1'返回相同的结果,其中id='1a'

2022-02-24 00:00:00 mariadb mysql
我创建了一个表,将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 Reference Manual / Functions and Operators / Type Conversion in Expression Evaluation(找不到mariadb的文章)

以下规则描述了如何进行转换以进行比较 操作:

  • 如果一个或两个参数都为NULL,则比较结果为NULL,除非使用NULL-SAFE<;=>;相等比较运算符。为 NULL<;=>;NULL,结果为TRUE。不需要转换。

  • 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。

  • 如果两个参数都是整数,则将它们作为整数进行比较。

  • 如果不将十六进制值与数字进行比较,则将其视为二进制字符串。

  • 如果其中一个参数是时间戳或日期时间列,而另一个参数是常量,则该常量将转换为时间戳 在执行比较之前。这样做是为了更好地 ODBC友好。这不适用于IN()的参数。为了安全起见, 执行操作时,请始终使用完整的日期时间、日期或时间字符串 比较。例如,要在以下情况下使用时达到最佳效果 对于日期值或时间值,请使用CAST()显式转换值 设置为所需的数据类型。

  • 来自一个或多个表的单行子查询不被视为常量。例如,如果子查询返回要比较的整数 对于日期时间值,比较是以两个整数进行的。这个 整数不会转换为时间值。要比较操作数,请执行以下操作 作为日期时间值,使用cast()显式转换子查询 值设置为DateTime。

  • 如果其中一个参数是十进制值,则比较取决于另一个参数。如果满足以下条件,则将参数作为十进制值进行比较 另一个参数是十进制值或整数值,或浮点形式 值,如果另一个参数是浮点值。

  • 在所有其他情况下,参数作为浮点(实数)数进行比较。例如,字符串和数字的比较 操作数作为浮点数的比较发生。

比较整数列和字符串文字。在这种情况下应用最后一个规则。本例中将'1''1a''1b'转换为数字1,并选择id=1行。

相关文章