今天我发现我们的代码似乎与PDO的变化向后兼容.在PHP <5.6中,结果集从a PDOStatement到其函数fetch和fetchAll返回的行,其值为字符串或null.我们的代码依赖于此属性.
前一段时间我们更新到PHP 7.事实证明,PDO现在尝试将一些数据类型转换为其他相关类型.例如,FLOAT列在PDOStatement结果集中创建浮点值.并且TINYINT列在结果集中创建整数值.有趣的是,当一个BIGINT或一个大小INT UNSIGNED不能显示为整数而某些其他类型(例如DECIMAL)不会转换为任何类型时,它会显示为字符串.它们仍然是弦乐.我认为这是一个普遍认同的原则,将数据类型从MySQL数据库转换为PHP数据类型是有问题的,不应该由PHP本身执行,但显然PHP 7决定不这样做.
因此,PHP 7的PDO引入了一组转换规则,它在内部用于转换从数据库中选择的值,但这会破坏我的代码库,并且由于这些转换规则的不一致,我宁愿不改变我的代码库以适应他们.可能有某种设置或标志我可以切换以防止PDO转换它所获取的值吗?
它不是PHP7,而是名为mysqlnd的底层驱动程序.
此外,它不是一组转换规则,而是传输协议的工作方式:当使用mysqlnd和native prepatred语句时,则使用二进制传输协议,这意味着总是有关于数据类型的信息.因此,数据只是从二进制格式解压缩到正确类型的变量中 - 当PHP有一个合适的变量时,即INTs和FLOATs(请注意,由于此类型的性质,返回DECIMAL类型字符串).
如果您不想要此行为,则有一个配置选项
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
Run Code Online (Sandbox Code Playgroud)
将像以前一样将此行为恢复为字符串和空值
| 归档时间: |
|
| 查看次数: |
756 次 |
| 最近记录: |