[mysql]DBAL 基数冲突错误

标签: sql MySQL PHP
发布时间: 2017/4/9 21:37:46
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我得到了基数违反的错误,下面的 SQL:

Doctrine\DBAL\Exception\DriverException︰ 执行时发生异常

SELECT p.* FROM mod_products_products p 
LEFT JOIN mod_products_products_categories c_link ON c_link.product_id = p.id 
LEFT JOIN mod_products_brands b ON p.brand_id = b.id 
LEFT JOIN mod_products_groups vg ON p.variation_id = vg.id 
LEFT JOIN mod_products_categories c ON c_link.category_id = c.id 
LEFT JOIN mod_products_group_options vg_o ON vg_o.group_id = vg.id 
LEFT JOIN mod_products_group_values vg_o_v ON vg_o_v.option_id = vg_o.id 
WHERE (p.name LIKE (?, ?)) AND (p.parent_id = 0) AND (vg_o.disabled=0) 
GROUP BY p.id ORDER BY p.name ASC 
LIMIT 18446744073709551615 OFFSET 0

以 params ["%大 %"、"光 %"]: SQLSTATE [21000]: 基数违反︰ 1241年操作数应包含 1 列。

如果定义的参数列表中的多个值,才会出现错误 WHERE (p.name LIKE (?, ?))

我使用的 executeQuery() ,并通过将数组作为 Connection::PARAM_STR_ARRAY 。在原始语句我定义为故障点︰

$builder->andWhere('p.name LIKE (:partial_names)');

好像它不喜欢得到数组作为 partial_names 传递。什么造成这,以及如何避免它任何意见吗?

解决方法 1:

MySQL是一种"字符串比较函数"等这样比较一个字符串到另一个,使用"简单模式匹配"。

如果你检查SQL 标准,你会注意到的 BNF 语法 LIKE 接受只有像"字符"和"八位位组样"参数,这两个国家基本上是我们所谓的字符串。(还有一些细节周围的事实, LIKE 对 RHS,有别于如何执行二进制的字符的字符匹配 = 经营︰ foo LIKE 'bar'foo='bar' 可能会产生不同的结果。)

所有这一切意味着你不能LIKE ('a', 'b') 因为柱状表达 ('a', 'b') 不是字符串一样。或在令人讨厌的标准语言,它的基数 (2) 不同于预期的基数 (1)。然而,您可以这样做在 MySQL 和 SQLite (也许其他引擎)︰

WHERE foo LIKE ('%bar')

因为 RHS 的基数是的 1 (有是一列),是什么 LIKE 预计。

你想要有效地类似于 foo LIKE IN ('a', 'b') ,但不存在要么 (为上面提到的 SQL 标准原因)。此 Q & A显示了一些变通办法为这种行为, REGEXP 基于被接受的答案。

因此,要解决此错误,您需要重写查询使用多个 LIKE ,或 REGEXP ,或甚至是类似 FIND_IN_SET

官方微信
官方QQ群
31647020