如何在不区分大小写的 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) collat​​e 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 数据库上执行区分大小写的搜索?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中如何去除大小写区分的设置?!

如何查看mysql表名字段是不是区分大小写

MySQL数据库设置表名区分大小写

如何设置mysql 数据库列内容区分大小写

如何在mysql中使字段区分大小写

如何让mysql的表名/字段名/字段值区分大小写