我正在从AS400(IBM iSeries数据库)表中选择19列。查询运行良好,总行数小于17000。然而,一旦我运行
$row = $statement->fetch(PDO::FETCH_NUM)
PHP内存不足(512兆)。脚本甚至不需要一秒钟就崩溃了——有些东西会立即耗尽每一点内存。
我可以从不同的表中提取更多的列,总共返回150000行(使用相同的fetch()命令),内存消耗保持稳定在500KB左右。然而,另一个select fetch的某些内容完全破坏了这个过程。
我在64位linux上使用来自IBM的iSeries ODBC驱动程序。如有任何关于进一步故障排除的建议,我们将不胜感激。
UPDATE:我已经将问题隔离到导致此问题的列中——它是一个长度为4的CHARACTER字段。破纪录的提取实际上在该字段中有一个null。在如何处理null的问题上,驱动程序可能存在一些误解。
这显然是IBM 64位驱动程序的已知问题:https://bugs.php.net/bug.php?id=54007
除了移植错误报告中建议的修复程序和重新编译PHP之外,还可以使用变通方法,比如向可以为null的字段添加IFNULL函数调用。不完全是一个解决方案,但在IBM弄清楚这一点之前(如果他们弄清楚的话),它必须这样做。
更新:如果有人遇到这个问题,很明显,虽然iSeries odbc驱动程序确实存在这个问题(而且可能永远不会更新),但有一个名为IBM i Access Client的新连接软件,它提供了一个更好的odbc驱动程序。
有关下载位置的说明如下:http://www-01.ibm.com/support/docview.wss?uid=nas8N1010355
也许你可以这样做:
select case
when offending_field is null then 'NULL'
else offending_field end as offending_field
from TABLE_NAME where CONDITION.