MariaDB 10条件,其中id=';1';返回相同的结果,其中id=';1a';
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
行。
相关文章