为什么 PDO::ATTR_EMULATE_PREPARES => TRUE 将所有值作为字符串返回

Fél*_*ier 5 php mysql pdo

这是有点共同的知识与不同版本的PHP和MySQL,并通过使用本地预处理语句或模拟预处理语句,可以有natine值类型或没有,像这样:

$value = $db->query("SELECT 1033 AS Code")->fetch(PDO::FETCH_COLUMN)
$value2 = $db->query("SELECT '1033' AS Code")->fetch(PDO::FETCH_COLUMN);

//PDO::ATTR_EMULATE_PREPARES set to true:
var_dump($value); // string(4) "1033"
var_dump($value2); // string(4) "1033"

//PDO::ATTR_EMULATE_PREPARES set to false:
var_dump($value); // int(1033)
var_dump($value2); // string(4) "1033"
Run Code Online (Sandbox Code Playgroud)

这篇文章:

问题是 PDO 由于类型转换为字符串而导致 zval-separation。转换由 PDO 核心请求。

默认情况下,PDO 将始终将数据转换为字符串,并且 PDO_MYSQL 驱动程序只能通过返回 zval 来解决此 PDO 默认值。

为什么 PDO 总是将数据转换为字符串?

Ran*_*eed 3

前提是

PDO 将为本身不支持它们的驱动程序模拟准备好的语句/绑定参数

...此功能(模拟准备好的语句)可能由所有驱动程序通用的一段代码处理。

然而,基于这样的功能PDOStatement::getColumnMeta()并没有为所有驱动程序实现,

并非所有 PDO 驱动程序都支持 PDOStatement::getColumnMeta()。

...我假设PDO 公共代码库无法以一致的跨数据库方式确定数据库列类型,因此必须回退到通用字符串类型。

不幸的是,源代码对我来说太晦涩难懂,无法验证这些假设。