我从AS400(IBM iSeries数据库)表中选择了19列。查询运行正常,总行数小于17,000。但是,一旦我跑了
$row = $statement->fetch(PDO::FETCH_NUM)
PHP耗尽内存(512兆)。该脚本甚至不会花费一秒钟来崩溃 - 有些东西会立即耗尽所有内存。
我可以从另一个表中获取更多列,返回总共150,000行(使用相同的fetch()命令)并且内存消耗保持稳定在500 KB左右。然而,关于其他选择提取的一些东西完全消灭了这个过程。
我在64位linux上使用IBM的iSeries ODBC驱动程序。任何进一步故障排除的建议将不胜感激。
更新:我已将问题隔离到列中导致此问题 - 它是长度为4的CHARACTER字段。打破提取的记录实际上在该字段中为空。可能是驱动程序对如何处理空值的一些误解。
这显然是IBM的64位驱动程序的一个已知问题:https://bugs.php.net/bug.php?id=54007
代替移植错误报告中建议的修复并重新编译PHP,可以使用解决方法,例如向可以为空的字段添加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.