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

Php 理解参数化查询中i和s之间的含义,php,mysql,Php,Mysql,我刚刚弄明白了为什么从PHP前端运行的查询比从MySQL监视器运行查询要花费大约50秒的时间,但我想更好地理解其中的含义。我现在使用两个变量,$extension和$today,并通过参数化将它们发送到mysql。当我选择将$extension作为整数引用时,需要很长时间。当我把它称为字符串时,它是非常瞬时的 查询 $stmt = $db_conn->prepare( "select from_unixtime(dateTimeOrigination) as date_of_call_or

我刚刚弄明白了为什么从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-$扩展名在技术上是一个字符串,但它总是由数字组成。叫它整数不是更好吗?它可以是5到15个字符之间的任意长度


2-通过将其称为字符串,它可能会导致任何安全问题吗?

我很惊讶它会有很大的不同。尽管您的测试似乎与此观点相矛盾,但我认为查询的缓慢部分是:

FROM_UNIXTIME(dateTimeOrigination) BETWEEN ? and ADDDATE(?, INTERVAL 1 DAY)
我会改成

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

它们似乎是电话号码,应该始终是字符串,以保留前导零,并避免要求数字类型具有足够的小数位数;如果列是字符串,则在where子句中使用字符串,如果它们是不同的类型,则需要进行类型转换,这将较慢,可能会影响索引的使用。嗨,Alex-因此,如果列类型是varchar,我应该将其声明为“I”?使用“s”表示stringHi,Alex-抱歉,我是指s。谢谢你,谢谢你的帮助。嗨,草莓。你是第二个提到这件事的人,我马上就去试试。非常感谢。