这是有点共同的知识与不同版本的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 总是将数据转换为字符串?
PDO 将为本身不支持它们的驱动程序模拟准备好的语句/绑定参数
...此功能(模拟准备好的语句)可能由所有驱动程序通用的一段代码处理。
然而,基于这样的功能PDOStatement::getColumnMeta()并没有为所有驱动程序实现,
并非所有 PDO 驱动程序都支持 PDOStatement::getColumnMeta()。
...我假设PDO 公共代码库无法以一致的跨数据库方式确定数据库列类型,因此必须回退到通用字符串类型。
不幸的是,源代码对我来说太晦涩难懂,无法验证这些假设。
| 归档时间: |
|
| 查看次数: |
1792 次 |
| 最近记录: |