PHP bind_param 将数字保存为 i 或 s 有什么区别?

PHP bind_param save number as i or s what difference does it make?

当我们做PHPprepare语句时,我们需要指定绑定类型,比如i,s,d,b。如果我将数字绑定为 "s" 字符串,会有什么区别?

它会影响数据库驱动程序(即php)将数据发送到您的 DBMS 的方式。绑定类型时,数据首先被转换为该特定类型,然后沿着线路发送到您的 DBMS。例如,假设 PHP 中的值是字符串 "9223372036854775808"。如果将其绑定为字符串,则数据将作为字符串发送到 DBMS,DBMS 可以自由地执行它需要的任何内部转换,以将值打包并存储在指定的列类型下。但是,如果您将其绑定为整数,则 PHP 将首先进行转换,然后再通过网络发送。这意味着该值首先变为 (int) "9223372036854775808",从而导致值 9223372036854775807,然后打包为 0xffffffff 的二进制有效负载。结果是 DBMS 将按原样接受数据,无需进一步更改。

这当然会产生不同的副作用。例如,整数大小(32 位与 64 位与任意精度)可能因控制转换和打包操作的人而异。此外,检查整数 overflow/wrap 精度的责任落在谁进行转换和打包的一方( 驱动程序与 DBMS)。其他副作用包括通过线路传输的负载大小。字符串大于压缩二进制整数。

理想情况下,在这种情况下,特异性是一件好事。因为大多数情况下,数据库只能通过将所有内容作为字符串发送来与 php 通信。尽管驱动程序可以就如何在 PHP 中表示该数据做出更明智的决定( 应该 对程序员很重要)给出该数据如何在两者之间绑定的更具体表示两端。