今天我发现我们的代码似乎与 PDO 的更改向后不兼容。在 PHP PDOStatement通过其职能fetch
and fetchAll
返回其值为字符串或 null 的行。我们的代码依赖于这个属性。
不久前我们更新到了 PHP 7。事实证明 PDO 现在尝试转换some数据类型到其他关联类型。例如,一个FLOAT
列创建一个浮点值PDOStatement
结果集。还有一个TINYINT
列在结果集中创建一个整数值。有趣的是,一个BIGINT
或大INT UNSIGNED
当无法显示为整数和某些其他类型(例如DECIMAL
)没有转换成任何东西。它们仍然是字符串。我认为这是一个普遍同意的原则,即将数据类型从 MySQL 数据库转换为 PHP 数据类型是有问题的,不应该由 PHP 本身执行,但显然 PHP 7 另有决定。
因此 PHP 7 的 PDO 引入了一组转换规则,它在内部使用这些规则来转换从数据库中选择的值,但这会搞砸我的代码库,并且由于这些转换规则的不一致,我宁愿不更改我的代码库以适应他们。是否有某种设置或标志可以切换以防止 PDO 转换它获取的值?
它不是 PHP7,而是底层驱动程序mysqlnd.
另外,它不是一组转换规则,而是传输协议的工作方式:当同时使用 mysqlnd 和本机 prepatred 语句时,则使用二进制传输协议,意味着始终存在有关数据类型的信息。因此,数据只是从二进制格式直接解压到适当类型的变量中 - 当 PHP 有适当类型的变量时,即 INT 和 FLOAT(请注意,由于这种类型的性质,对于 DECIMAL 类型会返回字符串)。
如果您不想要这种行为,可以使用一个配置选项
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
会像以前一样将此行为恢复为字符串和空值
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)