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

用户名

今天,我发现我们的代码似乎与PDO的更改向后不兼容。在PHP <5.6中,结果从中PDOStatement通过其函数设置fetchfetchAll返回其值为字符串或null的行。我们的代码依赖于此属性。

前一阵我们更新到PHP7。事实证明,PDO现在尝试将某些数据类型转换为其他关联类型。例如,一FLOAT列在PDOStatement结果集中创建一个浮点值TINYINT列会在结果集中创建一个整数值。有趣的是,当aBIGINTINT UNSIGNEDbig不能显示为整数并且某些其他类型(例如DECIMAL)未转换为任何内容时,它会显示为字符串它们仍然是字符串。我认为这是一个公认的原则,即将数据类型从MySQL数据库转换为PHP数据类型是有问题的,不应由PHP本身执行,但显然PHP 7则另当别论。

因此,PHP 7的PDO引入了一套转换规则,该转换规则在内部用于转换从数据库中选择的值,但是这弄糟了我的代码库,并且由于这些转换规则的不一致,我宁愿不更改我的代码库来适应他们。是否有某种设置或标志可以切换以防止PDO转换获取的值?

你的常识

它不是PHP7,而是称为mysqlnd的底层驱动程序
而且,它不是一组转换规则,而是传输协议的工作方式:当同时使用mysqlnd和本机预先编写的语句时,则使用二进制传输协议,这意味着始终存在有关数据类型的信息。因此,只是将数据从二进制格式解压缩为适当类型的变量-当PHP具有适当的变量时,即INT和FLOAT(请注意,由于这种类型的性质,将返回DECIMAL类型的字符串)。

如果您不希望出现这种情况,可以为此使用一个配置选项

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

将像以前一样将此行为恢复为仅字符串和null

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章