理解参数化查询中i和s之间的含义

时间:2017-02-03 16:40:00

标签: php mysql

我刚才弄清楚为什么从我的PHP前端运行的查询比从MySQL监视器运行它的时间长约50秒,但是想要更好地理解其含义。我正在使用两个变量, $ extension $ today ,并通过参数化将它们发送到mysql。当我选择将 $ extension 称为整数时,需要很长时间。当我把它称为字符串时,它是非常瞬间的。

查询;

$stmt = $db_conn->prepare(
"select from_unixtime(dateTimeOrigination) as date_of_call_origination ,
callingPartyNumber as calling_party_number, 
originalcalledpartynumber as original_called_party_number, 
finalCalledPartyNumber as final_called_party_number, 
SEC_TO_TIME(duration) as duration, 
origDeviceName, destDeviceName 
from cdr_records 
where (callingPartyNumber= ? or originalcalledpartynumber= ? or finalcalledpartynumber = ?) 
and 
from_unixtime(dateTimeOrigination) between ? and ADDDATE(?, INTERVAL 1 DAY) order by datetimeorigination desc");

我的绑定声明;

原始

$stmt->bind_param('iiiss', $extension, $extension, $extension, $today, $today);

已更改为

$stmt->bind_param('sssss', $extension, $extension, $extension, $today, $today);

所以,我有两个问题;

1 - $ extension 在技术上是一个字符串,但它总是由数字组成。称它为整数不是更好吗?它可以是5到15个字符之间的任何长度。

2 - 通过将其称为字符串,是否可能会出现任何安全问题?

1 个答案:

答案 0 :(得分:1)

我很惊讶它有很大的不同。虽然你的测试似乎与这个观点相矛盾,但我认为查询的缓慢部分就是这样:

FROM_UNIXTIME(dateTimeOrigination) BETWEEN ? and ADDDATE(?, INTERVAL 1 DAY)

我会改为

datetimeorigination BETWEEN UNIX_TIMESTAMP(?) AND UNIX_TIMESTAMP(? + INTERVAL 1 DAY)