mysql IN子句中的大数组爆破由于长度原因显示错误

时间:2018-12-08 05:25:12

标签: php mysql

这是给我一个错误的查询。如果我在本地服务器上运行此代码,则工作正常。但是在我的实时服务器中,它显示错误。我认为此错误与服务器配置有关,因此我增加了实时服务器的max_allowed_pa​​cket选项。但是仍然出现相同的错误

 $dueClassification = "
    SELECT installmentNo,collection_date,lastInstallmentDate,sales_date,sales_bill_no,installment_amount,pay_amount,total_sales_amount 
    FROM collection 
    WHERE  sales_type =2 AND collection_date <= '$endDate' 
        AND sales_bill_no IN ('" . implode("','", $currentPeriodSalesBillNoArr) . "')";

1 个答案:

答案 0 :(得分:0)

根据mysql docs,IN列表中的值数仅受参数max_allowed_packet限制。

您可以尝试增加此参数的大小(默认值为64 Mb,最大值为1Go)。

当这种方法失败时,下一个选择是使用JOIN查询。这可能甚至更快,因为您将只执行一个查询,而不是当前实施中的两个查询(之间使用php处理)。确切的语法取决于您如何恢复列表-您没有向我们展示代码的那部分。

NB:如果列表中的值为数字,则不应引用IN子句的参数;这不一定能解决列表大小的问题(特别是如果数字很小的话),但可以使您的查询更高效。