我在 8 个字段中构建了一个包含 10,000 行的大型多行插入查询,这意味着我将 90,000 个值作为数据数组传递给 pg_query_params。
我收到了这个错误:
警告:pg_query_params():查询失败:错误:绑定消息提供 24464 个参数,但准备好的语句“”在第 57 行的 class.postgresql.php 中需要 90000
我仔细检查了 SQL 和数据数组,肯定有 90,000 个值被传递,但由于某种原因,它只检测到 24464 的幻数。想法?
我在 8 个字段中构建了一个包含 10,000 行的大型多行插入查询,这意味着我将 90,000 个值作为数据数组传递给 pg_query_params。
我收到了这个错误:
警告:pg_query_params():查询失败:错误:绑定消息提供 24464 个参数,但准备好的语句“”在第 57 行的 class.postgresql.php 中需要 90000
我仔细检查了 SQL 和数据数组,肯定有 90,000 个值被传递,但由于某种原因,它只检测到 24464 的幻数。想法?
postgres 使用的有线协议表明使用的参数数量作为有符号的 2 字节整数传递,90000 显然不适合。
看起来 php 驱动程序只是忽略了不适合 2 字节整数的内容 - 90000 是 0x015f90,如果你只取它的低 2 个字节,那么你会得到 0x5f90,即 24464。将插入分成更小的批次,你应该没事
<clippy>您似乎正在尝试使用大型多记录INSERT
语句将数据批量加载到您的 PostgreSQL 数据库中。这是低效且笨拙的,尽管比使用单个插入而不围绕显式事务要好得多。您应该重写您的代码以使用pg_copy_from()COPY
,通过 PHP 的 postgresql 驱动程序提供给它的漂亮接口来使用 PostgreSQL 的高效批量加载接口。</clippy>
说真的,COPY
这是要走的路,看起来 Pg PHP 驱动程序支持它。如果您需要更多控制,似乎您也可以使用pg_put_line()和显式来完成。COPY