Php 为什么PDO::ATTR\u模拟\u PREPARES=>;TRUE以字符串形式返回所有值

Php 为什么PDO::ATTR\u模拟\u PREPARES=>;TRUE以字符串形式返回所有值,php,mysql,pdo,Php,Mysql,Pdo,我们知道,在不同版本的php和mysql中,通过使用本机准备语句或模拟准备语句,可以有或没有本机值类型,如下所示: $value = $db->query("SELECT 1033 AS Code")->fetch(PDO::FETCH_COLUMN) $value2 = $db->query("SELECT '1033' AS Code")->fetch(PDO::FETCH_COLUMN); //PDO::ATTR_EMULA

我们知道,在不同版本的php和mysql中,通过使用本机准备语句或模拟准备语句,可以有或没有本机值类型,如下所示:

$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"
第条:

问题是,由于类型转换为字符串,PDO导致zval分离。铸造是由PDO核心要求的

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

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

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

。。。这个特性(模拟的准备好的语句)可能由所有驱动程序都通用的一段代码来处理

但是,基于并非所有驾驶员都能实现类似的功能

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

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


不幸的是,源代码太模糊,我无法验证这些假设。

我一直认为这是因为并非所有PHP版本都支持64位整数,因此无法以本机PHP格式返回BIGINT。但在PHP的最新版本(mysqlnd需要)中,这种情况可能已经改变。