php-在bind_param() 中长时间使用“s”或“i”?

问题描述

关于function findTopValues(dataArray,n) { var resultArray = []; var dataArraycopy = dataArray.slice(); var topNArray = dataArraycopy .sort(function (begin,end) { return end - begin; }) .slice(0,n); for (let ele of topNArray) { resultArray.push([dataArray.indexOf(ele),ele]); } return resultArray; } var dataArray = [12,5,20,4,50,23,98,8]; console.log(findTopValues(dataArray,3))的{​​{1}}函数,在php documentations中提到:

如果您指定类型“i”(整数),它允许您拥有的最大值是 2^32-1 或 2147483647。因此,如果您在您的文件中使用 UNSIGNED INTEGER 或 BIGINT数据库,那么您最好为此使用 "s" (字符串)。

这里是说我们应该对 bind_param() 列使用 prepared statement。但我尝试 s一个大的 int 列中插入一个 long 并且它工作正常。所以这让我很困惑!对于 big int,我们实际上应该使用 big int 还是 i?!

解决方法

几乎所有的事情都应该使用 s。当您希望 mysqli 将值转换为适合您的类型时,只有少数场景。将所有内容绑定为字符串是最安全的选择。 SQL 无论如何都会将该值转换为它需要的类型。

您在 php.net 网站上发现的评论意味着,如果您将整数字符串转换为 PHP 原生整数,那么它可能会在 32 位系统上溢出。 PHP 使用有符号整数,这意味着在 32 位系统上的最大值只有 2147483647。如果你有一个大于这个的整数,你应该使用字符串来防止溢出。

BIGINT(64 位整数)和有符号 INT 都大于 PHP 32 位系统上的最大整数。但是,如果将所有内容绑定为字符串,则无需担心丢失任何值。