PHP: 7 PDO fetch(All)尝试将类型转换为关联的类型


PHP: 7 PDO fetch(All) tries to convert types to associated type

今天我发现我们的代码似乎与PDO的更改向后不兼容。在PHP <5.6中,从PDOStatementfetchfetchAll函数的结果集返回值为字符串或null的行。我们的代码依赖于这个属性。

不久前我们更新到PHP 7。事实证明,PDO现在尝试将一些数据类型转换为其他相关类型。例如,FLOAT列在PDOStatement结果集中创建一个浮点值。TINYINT列在结果集中创建一个整数值。有趣的是,BIGINT或较大的INT UNSIGNED在不能显示为整数时显示为字符串,并且某些其他类型(如DECIMAL)不能转换为任何类型。它们仍然是弦。我认为这是一个普遍同意的原则,将数据类型从MySQL数据库转换为PHP数据类型是有问题的,不应该由PHP本身执行,但显然PHP 7另有决定。

所以PHP 7的PDO引入了一组转换规则,它在内部使用这些转换规则来转换从数据库中选择的值,但这打乱了我的代码库,由于这些转换规则的不一致性,我宁愿不改变我的代码库来适应它们。是否有某种设置或标志,我可以切换以防止PDO转换它获取的值?

不是PHP7,而是底层的驱动程序mysqlnd
此外,它不是一组转换规则,而是传输协议的工作方式:当使用mysqlnd和本机预处理语句时,则使用二进制传输协议,这意味着总是有一个关于数据类型的信息。因此,数据只是从二进制格式解压缩到适当类型的变量中—当PHP有适当的类型时,即int和float(注意,对于DECIMAL类型返回字符串,由于该类型的性质)。

如果你不想要这个行为,这里有一个配置选项

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);

将恢复此行为为字符串和空,就像以前一样