MySQL IN() 列表是否有限制
Is there a Limit on MySQL IN() list
我在 MySQL IN() 列表中有大约 273 个项目,我认为这会导致获取这些项目所需的所有信息时出现问题,并且不确定如何更改此查询只有 1 个或至少少于 273 个单独的查询。基本上我有一个字符串名称列表,我需要查询并获取 Name
和 ListID
,其中 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
子句中的项目数有关。
我在 MySQL IN() 列表中有大约 273 个项目,我认为这会导致获取这些项目所需的所有信息时出现问题,并且不确定如何更改此查询只有 1 个或至少少于 273 个单独的查询。基本上我有一个字符串名称列表,我需要查询并获取 Name
和 ListID
,其中 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
子句中的项目数有关。