2011-04-22 99 views
3

在我的数据库utf8_general_ci中,99.99%的搜索应该不区分大小写。现在有一个特定的情况,我需要以区分大小写的方式找到一些数据。该字段是一个varchar字段,我通常会搜索不区分大小写的字段。如何在不区分大小写的MySQL数据库上执行区分大小写的搜索?

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

回答

6

SELECT * FROM转换(PAGETITLE使用LATIN1),其中整理utf8_ = '东西'

页面,我发现this answer足够的描述:)

+2

回答,但是(未知的排序规则:'utf8_')没有工作,所以我将它改为'FROM \'table \'WHERE convert(\'collumn \ '使用latin1)COLLATE latin1_general_cs LIKE'%wOrd'' – Moak 2011-04-22 08:08:28

+0

其实我只是从答案中复制它...仅供参考 – 2011-04-22 08:12:06

+0

它会导致性能问题,但因为您只在0.01%的情况下使用它:)我不认为这对你来说很重要......如果你找到更好的解决方案,更新我们之间。 – 2011-04-22 08:45:02

4

你必须使用COLLATE操作

OR

如果你想要一个列总是要 区分大小写的方式处理, 改变其在搜索查询中使用的操作数的排序规则用区分大小写或 二进制排序规则来声明它。

这里http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html

+0

这看起来不错,但是mysql手册并不是很清楚在哪里应用这个'COLLATE'到一个表中的SELECT语句 – Moak 2011-04-22 07:59:07

+0

SELECT name FROM table WHERE CONVERT(name USING utf8)COLLATE utf8_general_cs LIKE“%anne% “;请注意_cs后缀。 – 2011-04-22 08:07:43

+0

'#1273 - 未知的排序规则:'utf8_general_bin''谢谢,但我使用latin1,然后它的工作 – Moak 2011-04-22 08:11:34

3

见我建议改变排序类型,使之成为区分大小写,然后改变的其他情况下,99.99%的代码。有关更改现场检查的情况下信息:http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html

您可以使用LOWER()UPPER()功能在SQL一次字段类型设置为区分大小写为不敏感的搜索规范的情况。

+1

请注意,如果存在,LOWER/UPPER将使列上的索引不可用。 – 2011-04-22 07:41:41

+0

这并不能真正回答我的问题。为了清晰起见,我编辑了我的问题。恐怕在这个阶段没有办法选择返回并更改所有代码,并且我的专栏已被编入索引并且需要变得不敏感,所以OMG Ponies对我来说是一个真正的风险。 – Moak 2011-04-22 07:50:07

+0

我看到了,在这种情况下,我会从@ ankur.singh – 2011-04-22 07:59:14

1

您可以查询区分大小写, 例如,如果您想要检查用户名和密码:

Select * from TableName Where WHERE [email protected] COLLATE SQL_Latin1_General_CP1_CS_AS AND [email protected] COLLATE SQL_Latin1_General_CP1_CS_AS 

它检查用户名和密码,如果它们为真(区分大小写),则返回值。