如何在大小写不敏感的MySQL数据库中执行大小写敏感的搜索?

3

在我的数据库中,使用的是 utf8_general_ci 编码,99.99% 的搜索应该不区分大小写。现在有一种特殊情况,我需要以区分大小写的方式查找一些数据。该字段是一个 varchar 类型的字段,通常我会进行不区分大小写的搜索。

我的问题是:我可以对通常不区分大小写的字段执行区分大小写的搜索吗?

4个回答

6

从页面中选择所有内容 其中将pageTitle使用latin1转换后 collate utf8_ = 'Something'

我发现这个答案已经很详细了 :)


2
好的,然而(Unkown collation: 'utf8_')不起作用,所以我将其更改为FROM \table` WHERE convert(`collumn` using latin1) COLLATE latin1_general_cs LIKE '%wOrd'`。 - Moak
其实我只是从那个答案中复制了它...仅供参考。 - ankur.singh
这会导致性能问题,但由于你只在0.01%的情况下使用它:)我认为它不会对你产生太大影响...如果你找到更好的解决方案,请告诉我们更新。 - ankur.singh
一个使用utf8的例子可以是"SELECT * FROM my_table WHERE CONVERT(my_value USING utf8) COLLATE utf8_general_ci LIKE '%Something%'" - scott

4

您需要使用COLLATE操作符更改搜索查询中使用的操作数的排序规则。

或者

如果您希望一列始终以区分大小写的方式进行处理,请使用区分大小写或二进制排序规则声明它。

请参见这里


这看起来是正确的,但是mysql手册并没有很清楚地说明在哪里将COLLATE应用于从表中选择语句。 - Moak
SELECT name FROM table WHERE CONVERT(name USING utf8) COLLATE utf8_general_cs LIKE "%anne%"; 注意_cs后缀。 - Will Martin
#1273 - 未知排序规则:'utf8_general_bin',谢谢,我使用了latin1然后它就可以工作了。 - Moak

3
我建议更改排序类型,使其变为区分大小写,然后在99.99%的其他情况下更改您的代码。有关更改字段大小写的信息,请参见:http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html 一旦字段类型设置为区分大小写,您可以在SQL中使用LOWER()和UPPER()函数来标准化大小写以进行不区分大小写的搜索。

1
请注意,如果该列存在索引,则LOWER / UPPER将使该索引无法使用。 - OMG Ponies
这并没有真正回答我的问题。我已经编辑了我的问题以获得更清晰的表述。恐怕现在回头改变所有代码不是一个选项,而且我的列已经被索引,并且需要不区分大小写,所以OMG Ponies的评论对我来说是一个真正的风险。 - Moak
我明白了,在这种情况下,我会选择@ankur.singh的答案。 - Mark Aroni

1

您可以进行区分大小写的查询, 例如,如果您想检查用户ID和密码:

Select * from TableName Where WHERE LoginId=@userid COLLATE SQL_Latin1_General_CP1_CS_AS AND Password=@password COLLATE SQL_Latin1_General_CP1_CS_AS

它检查用户ID和密码,如果它们是真的(区分大小写),则返回这些值。


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