有些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会始终将数据转换为字符串?
答案 0 :(得分:2)
PDO将为本身不支持它们的驱动程序模拟准备好的语句/绑定参数
...此功能(模拟预处理语句)可能由一段代码处理,这段代码对所有驱动程序都是通用的。
但是,基于PDOStatement::getColumnMeta()
等函数未针对所有驱动程序实现的事实,
并非所有PDO驱动程序都支持PDOStatement :: getColumnMeta()。
...我假设 PDO公共代码库无法以一致的跨数据库方式确定数据库列类型,因此必须回退到通用字符串类型。
不幸的是,源代码对我来说太过模糊,无法验证这些假设。