MySQL查询使用'in'运算符:为什么与/ quotes不同的结果?

时间:2012-09-22 15:56:52

标签: mysql sql coercion

我已经通过两种不同的方式跟踪了一个奇怪的MySQL问题。当你把所有东西都烧掉时,这种方式会返回更多结果:

SELECT DISTINCT <stuff> FROM <tables> 
WHERE promo_detail_store_id in (8214, 8217, 4952, 8194, ...)

对WHERE子句的这一更改产生了这些结果的子集:

WHERE promo_detail_store_id in ('8214, 8217, 4952, 8194, ...')

(promo_detail_store_id被定义为MyISAM表中的BIGINT。)

最初store_ids的列表要长得多,而且我开始缩短它的时间并且更短思考可能对字符串的长度有一些奇怪的限制。但不,它也适用于相当小的字符串/列表。显然,在幕后涉及类型强制的事情可能会发生,也许'in'运算符的运作方式。有人可以开导我吗?

2 个答案:

答案 0 :(得分:10)

WHERE promo_detail_store_id in (8214, 8217, 4952, 8194, ...)

表示

WHERE promo_detail_store_id = 8214 
OR  promo_detail_store_id = 8217
OR promo_detail_store_id = 4952 
OR promo_detail_store_id = 8194
OR ... 
 
WHERE promo_detail_store_id in ('8214, 8217, 4952, 8194, ...')

装置

 WHERE promo_detail_store_id = '8214, 8217, 4952, 8194, ...'

'8214, 8217, 4952, 8194, ...'会将数字转换为8214,因此它将是

WHERE promo_detail_store_id = 8214

答案 1 :(得分:3)

第二个条件实际上等同于WHERE promo_detail_store_id IN (8214),因为您将BIGINTTEXT进行比较,并将文本强制转换为整数值,这将忽略第一个值字符串末尾的非数字字符。