“是怎么回事?”;sqlite“你看它是否是一个数字”;有关;mysql绑定类型猜测;?

“是怎么回事?”;sqlite“你看它是否是一个数字”;有关;mysql绑定类型猜测;?,mysql,perl,sqlite,binding,Mysql,Perl,Sqlite,Binding,当我使用sqlite\u see\u如果它的a\u编号被禁用,我就不会得到任何结果。启用sqlite\u see\u如果它的\u a\u编号我会得到预期的结果: $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); 当我在具有相同数据

当我使用
sqlite\u see\u如果它的a\u编号
被禁用,我就不会得到任何结果。启用
sqlite\u see\u如果它的\u a\u编号
我会得到预期的结果:

$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查询时,无论

这两个属性之间有什么区别?

此查询:

SELECT bar FROM foo GROUP BY bar HAVING count(*) > '5'
自动转换为:

SELECT bar FROM foo GROUP BY bar HAVING count(*) > 5
前者是使用占位符时,
DBI
发送到数据库的内容。由于MySQL自动处理转换,所以设置
MySQL\u bind\u type\u猜测的唯一原因是为了性能:为什么不需要进行不必要的类型转换*

另一方面,在SQLite中,
count(*)
(整数)总是小于
'5'
(文本)。如果不设置sqlite\u see\u如果它的\u a\u编号
,绑定值将始终用引号括起来,因此此比较将始终失败



*在MySQL的最新版本(大于5.1.42、5.6.0或6.0.14)中,性能增益可能可以忽略不计:当与常量(例如
count(*)>'5'
)进行比较时,转换完成一次,结果被缓存。在早期版本中,转换是针对每一行进行的,这会导致出现非常大的引号,如
'9999999999'

@ThisSuitelsBlack不使用此查询示例:是否只需要一次转换,还是每个分组的“条”都需要转换(如果未启用
mysql\u bind\u type\u猜测
)?@sid\u com我看不到您的示例查询。@ThisSuitelsBlacknot MySQL:类似于
SELECT*FROM number>3
的查询是否只需要一次转换,或者每个表行只需要一次转换(如果未启用MySQL\u bind\u type\u猜测)?@sid\u com根据:“当比较不同类型的值时,会将它们转换为允许正确比较的类型。每次比较都会进行此转换,需要一些时间。当比较一个常数时,可以在转换为加速比较后缓存该值。”最后一句话中提到的缓存在MySQL 5.1.42、5.6.0和6.0.14中得到了修复。@sid_com DBI将
SELECT*FROM table WHERE number>'3'
发送到MySQL,前提是
MySQL\u bind\u type\u gussing
处于关闭状态(可以通过打开常规查询日志进行验证)。
'3'
是一个文本,因此也是一个常量。