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