使MySQL中的IN子句区分大小写

10

有人知道怎样让IN语句区分大小写吗?我知道可以在LIKE语句中使用COLLATE进行字符串搜索,但我不确定是否可以或者如何在IN语句中使用。例如我想要做的是:

SELECT * FROM pages_table WHERE topic IN ('Food','NightLife','Drinks')

我希望它能返回主题为“食品”的页面,但不包括主题为“food”的页面,目前查询的结果是两者都返回,谢谢。

2个回答

9

你可能在其他示例中已经看到过,实际上你可以像这样使用它:

SELECT *
FROM pages_table
WHERE CAST(topic AS CHAR CHARACTER SET latin1)
        COLLATE latin1_general_cs IN ('Food','NightLife','Drinks')

这将把字符集更改为支持大小写敏感并对该列进行排序(根据您自己的字符编码,您可能不需要执行此操作)。


@mellamokb 很棒,你的评论有证据支持,加一分 :) - RocketDonkey
转换类型不会使运行速度变慢,对吗? - hackartist
@hackartist 如果你的意思是与上面的例子相比,你会发现由于函数调用的性能开销,速度会稍微慢一些(希望在你的情况下不会太明显)。一个有趣的检查方法是使用“BENCHMARK”函数测试执行速度。在我的设置中,如果我运行“SELECT BENCHMARK(10000000, CAST('abc' AS CHAR CHARACTER SET latin1) COLLATE latin1_general_ci)”,它需要约1.2秒,而“SELECT BENCHMARK(10000000, 'abc')”则只需约0.4秒。然而,将数字减少到1,000,000可以显著缩小差距。好时光 :) - RocketDonkey

9
你可以使用BINARY运算符。像这样:
SELECT *
FROM pages_table
WHERE CAST(topic AS BINARY) IN ('Food','NightLife','Drinks');

SQL Fiddle Demo


1
假设没有必要显式地进行CAST: ... WHERE BINARY topic IN ('Food','NightLife','Drinks'); - user2988142

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接