Mysql类型隐藏类型转换


Mysql type hidden type casting

我正在努力改进一个旧系统(编写于很久以前),在这个系统中,每个mysql查询都是从字符串粘贴而来的。所以这个查询的例子看起来像

"SELECT * FROM User WHERE id > '3'"

Id列当然是bigint和PK.

mysql对查询中id应该是int值的"3"做什么?我假设它被视为一个字符串(由于"),所以这个值在mysql分析/优化过程中被转换为int。我说得对吗?

//更新我可能问错路了。有两种处理方法。

  1. (Fast)Mysql自动检测id应该是int,并将查询重写/强制转换为

     SELECT * FROM User WHERE id > 3
    

    在将其发送到数据库引擎之前

  2. (难以置信)Mysql做

    SELECT * FROM
    

    然后在循环中应用条件WHERE id>"3",并为每一行强制转换

我只是想确定第二种选择是不可能的。

MySQL总是将字符串强制转换为一个数字进行比较,在这种情况下,这是正确的做法(它将使用列上的索引来查找值)
如果你的列是一个字符串,并且你将其与整数常量进行比较,MySQL会将该列强制转换为整数,而不使用索引。

MySQL会自动将其转换为正确的列类型。如果由于某种原因不能,它将抛出一个错误。

在任何情况下,如果参数可能来自不安全的来源(用户,外部API),请确保将准备好的语句与PDO或MySQLi一起使用。