MySQL IN() 列表是否有限制

Is there a Limit on MySQL IN() list

我在 MySQL IN() 列表中有大约 273 个项目,我认为这会导致获取这些项目所需的所有信息时出现问题,并且不确定如何更改此查询只有 1 个或至少少于 273 个单独的查询。基本上我有一个字符串名称列表,我需要查询并获取 NameListID,其中 Name 在 273 计数数组中:

$result = $wpdb->get_results('
    SELECT Name, ListID
    FROM ' . $wpdb->prefix . 'quickbook_items
    WHERE Name IN ("' . implode('", "', array_map('addslashes', $part_names)) . '")
    ORDER BY NULL', ARRAY_A);

我觉得我在某处读到过,如果列表太大,在 Wordpress 中使用带有 IN 的查询可能会出现问题,因为 Wordpress 不会抓取所有数据。但我不记得这是 Wordpress $wpdb 限制还是 MySQL 限制。在任何情况下,我都没有返回所有 273 行,所以我真的不确定如何执行此查询,同时保持数据库命中率低于 273 次(如果我将查询放在循环中会发生这种情况,遍历 $part_names.

有人对如何从 quickbook_items table 中查询 Name 和 ListID 有建议吗?真的可以在这里使用一些帮助,或者如果有一种方法可以不限制查询集的字符数来实现这一点?

IN 子句和 max_allowed_packet

IN (...) 中的 件数 没有明确的限制。

但是,SQL 字符串本身的长度(以字节为单位)受限于 max_allowed_packet 系统变量的值。

此处摘自MySQL documentation

The number of values in the IN list is only limited by the max_allowed_packet value.

max_allowed_packet 的默认值为 4 MB,因此除非您更改了该值,否则这极不可能是问题所在。 此外,达到这个限制会导致错误而不是错误的结果。


addslashes

使用addslashes 构建MySQL 字符串文字确实不是一个好主意。 为此考虑使用 mysqli_real_escape_string


一个建议

能否请您做以下分析问题。 在 $part_names 上构建一个循环,并执行完全相同的语句(包括 implode)- 但每次迭代仅针对一个名称。然后检查每次迭代是否 returns 一个 non-empty 结果。

这样你会得到没有返回的名字,它可以给你一些线索。

另一种可能的结果是 返回所有名称 - 在这种情况下,问题确实可能与 IN 子句中的项目数有关。