如何在不区分大小写的 MySQL 数据库上执行区分大小写的搜索?
Posted
技术标签:
【中文标题】如何在不区分大小写的 MySQL 数据库上执行区分大小写的搜索?【英文标题】:How to perform a case sensitive search on a case insensitive MySQL database? 【发布时间】:2011-08-10 19:49:08 【问题描述】:在我的utf8_general_ci
数据库中,99.99% 的搜索应该不区分大小写。现在有一种特殊情况,我需要以区分大小写的方式查找一些数据。该字段是一个 varchar 字段,我通常不区分大小写。
我的问题是:我可以对通常不区分大小写的字段执行区分大小写的搜索吗?
【问题讨论】:
【参考方案1】:您可以使查询区分大小写, 例如,如果您想检查用户名和密码:
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 和密码,如果它们为真则返回值(区分大小写)。
【讨论】:
【参考方案2】:从页面中选择 * where convert(pageTitle using latin1) collate utf8_ = 'Something'
我发现 this answer 描述性足够 :)
【讨论】:
好的,但是(未知排序规则:'utf8_')不起作用,所以我将其更改为FROM `table` WHERE convert(`collumn` using latin1) COLLATE latin1_general_cs LIKE '%wOrd'
其实我只是从那个答案中复制过来的……仅供参考
这会导致性能问题,但由于您仅在 0.01% 的情况下使用它 :) 我认为这对您来说并不重要……如果您找到更好的解决方案,请更新我们。
使用 utf8 的示例可以是“SELECT * FROM my_table
WHERE CONVERT(my_value
USING utf8) COLLATE utf8_general_ci LIKE '%Something%'”【参考方案3】:
我建议更改排序规则类型,使其区分大小写,然后在 99.99% 的其他情况下更改您的代码。有关更改字段检查大小写的信息:http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
一旦字段类型设置为区分大小写,您就可以在 SQL 中使用 LOWER()
和 UPPER()
函数来标准化不区分大小写的搜索。
【讨论】:
请注意,如果存在,LOWER/UPPER 将使列上的索引不可用。 这并不能真正回答我的问题。为了清楚起见,我编辑了我的问题。恐怕现阶段无法返回并更改所有代码,并且我的列已编入索引并且需要不敏感,因此 OMG Ponies 评论对我来说是一个真正的风险。 我明白了,在那种情况下,我会选择@ankur.singh 的答案【参考方案4】:您必须使用 COLLATE
运算符更改搜索查询中使用的操作数的排序规则
或
如果您希望列始终 以区分大小写的方式处理, 声明它区分大小写或 二进制排序规则。
请看这里http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
【讨论】:
这看起来不错,但是 mysql 手册并不清楚在哪里将这个COLLATE
应用于表中的 SELECT
语句
SELECT name FROM table WHERE CONVERT(name USING utf8) COLLATE utf8_general_cs LIKE "%anne%";注意 _cs 后缀。
#1273 - Unknown collation: 'utf8_general_bin'
谢谢,我用了 latin1 然后它工作了以上是关于如何在不区分大小写的 MySQL 数据库上执行区分大小写的搜索?的主要内容,如果未能解决你的问题,请参考以下文章