当我尝试这个例子时 - 正如 DBD::SQLite 中所解释的那样documentation - 禁用 sqlite_see_if_its_a_number
我没有得到任何结果。启用 sqlite_see_if_its_a_number
后,我得到了预期的结果:
$dbh->{sqlite_see_if_its_a_number} = 1;
my $sth = $dbh->prepare(q{
SELECT bar FROM foo GROUP BY bar HAVING count(*) > ?;
});
$sth->execute(5);
当我在具有相同数据的 MySQL 数据库表上尝试此 SELECT 查询时,无论 mysql_bind_type_guessing 的设置如何,它都按预期工作。 .
这两个属性有什么区别?
最佳答案
MySQL automatically converts numbers to strings as necessary, and vice versa.这个查询:
SELECT bar FROM foo GROUP BY bar HAVING count(*) > '5'
自动转换为:
SELECT bar FROM foo GROUP BY bar HAVING count(*) > 5
前者是使用占位符时 DBI
发送给数据库的内容。由于 MySQL 自动处理转换,设置 mysql_bind_type_guessing
的唯一原因是为了性能:为什么在不需要时进行不必要的类型转换*?
另一方面,在 SQLite 中,an INTEGER or REAL value is less than any TEXT or BLOB value.因此,count(*)
(INTEGER) 总是小于 '5'
(TEXT)。如果不设置 sqlite_see_if_its_a_number
,绑定(bind)值将始终用引号引起来,因此此比较将始终失败。
* 在最新版本的 MySQL(大于 5.1.42、5.6.0 或 6.0.14)中,性能提升可能可以忽略不计:当与常量进行比较时(例如 count(*) > '5'
), 转换完成一次并缓存结果。在早期版本中,转换是针对每一行进行的,这导致了 noticeable performance issues带有非常大的引号,例如 '999999999999'
。
关于mysql - "sqlite_see_if_its_a_number"与 "mysql_bind_type_guessing"有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20889596/