PHP 的 PDO::fetch() 运行 内存不足

PHP's PDO::fetch() running out of memory

我正在 select 从 AS400(IBM iSeries 数据库)table 获取 19 列。查询 运行 没问题,总行数少于 17,000。 但是,一旦我 运行

$row = $statement->fetch(PDO::FETCH_NUM)

PHP 运行 内存不足(512 兆)。该脚本甚至不会花一秒钟的时间崩溃 - 某些东西会立即耗尽所有内存。

我可以从不同的 table 获取更多列,总共返回 150,000 行(使用相同的 fetch() 命令)并且内存消耗保持在 stable 大约 500 KB。 然而,其他 select fetch 的一些东西完全破坏了这个过程。

我在 64 位 linux 上使用 IBM 的 iSeries ODBC 驱动程序。 对于进一步故障排除的任何建议,我们将不胜感激。

UPDATE:我已将问题隔离到导致此问题的列 - 这是一个长度为 4 的 CHARACTER 字段。打破提取的记录实际上在该字段中有一个空值.驱动程序可能对如何处理空值有一些误解。

这显然是 IBM 64 位驱动程序的一个已知问题: https://bugs.php.net/bug.php?id=54007

代替移植错误报告中建议的修复并重新编译 PHP,可以使用变通方法,例如向可以为 null 的字段添加 IFNULL 函数调用。不完全是一个解决方案,但在 IBM 解决这个问题之前必须这样做(如果他们这样做的话)。

UPDATE:如果有人遇到这个问题,显然 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.