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

时间:2014-08-20 17:32:52

标签: php mysql pdo

有些common知识,使用不同版本的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"

来自this文章:

  

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

     

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

为什么PDO会始终将数据转换为字符串?

1 个答案:

答案 0 :(得分:2)

Provided that

  

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

...此功能(模拟预处理语句)可能由一段代码处理,这段代码对所有驱动程序都是通用的。

但是,基于PDOStatement::getColumnMeta()等函数未针对所有驱动程序实现的事实,

  

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

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

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