在命令行上使用 MariaDB 时,使用 sum() 进行选择查询的结果是空值,但在表中找不到任何匹配的行。这是预期的:
MariaDB [test]> SELECT sum(turnover) as turnover FROM turnover where date >= 20301201000000;
+---------------------+
| turnover |
+---------------------+
| NULL |
+---------------------+
1 row in set (0,001 sec)
不幸的是,当我通过 PHP8/PDO 执行此查询时,我得到一个空字符串:
var_dump 的输出:
array(1) {
[0]=>
array(1) {
["turnover"]=>
string(0) ""
}
}
我已经明确关闭了 PDO::ATTR_STRINGIFY_FETCHES,但这没有帮助:
$dsn = 'mysql:host=' . $server . ';dbname=' . $dbname . ";charset=utf8";
$options = [PDO::ATTR_PERSISTENT => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_ORACLE_NULLS => PDO::NULL_TO_STRING, PDO::ATTR_STRINGIFY_FETCHES => false];
$dbh = new PDO($dsn, $user, $pass, $options);
$dbh->exec("set names utf8");
$query = "SELECT sum(turnover) as turnover FROM turnover where date >= 20301201000000;"
$stmt = $dbh->prepare($query);
$stmt->execute();
$resultset = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($resultset);
这会导致 PHP8 中出现问题,因为它会在我对该值执行的后续计算中引发致命错误:
PHP 致命错误:未捕获类型错误:不支持的操作数类型:字符串/整数
PHP版本:php-8.3.15 MariaDB 版本:10.11.6
如何更改此行为以使 null 值返回为 null?
我需要更改 PDO 的选项:
PDO::ATTR_ORACLE_NULLS => PDO::NULL_TO_STRING
应改为:
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL
我不确定为什么要这样设置,我希望它不会对应用程序的其他部分产生副作用,但它解决了我问的问题。