mysql - "sqlite_see_if_its_a_number"与 "mysql_bind_type_guessing"有什么关系?

标签 mysql perl sqlite binding

当我尝试这个例子时 - 正如 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/

相关文章:

PHP MySQL 联接表每行值的总和列

mysql - 在MySQL中以二进制格式存储字符串

perl - 如何让 2 个版本的 perl 在 Windows 7 上运行?

iphone - SQLite 异常 : SQLite Busy

php - MySQL从一张表读取到另一张表

mysql - 如何调试导致 '"出现错误 "Incorrect syntax near ' 的 SQL 查询?

python - 生成具有多个(多组多组多组)X轴数据集的图

perl DBI 和占位符

android sqlite 递增列值

sqlite - 如何使用 sqlite 在数据库中搜索作为查询子字符串的字段