如何在WHERE子句中进行区分大小写的搜索?


Answers:


22

默认情况下,MySQL不考虑字符串的大小写

这不是真的。每当您create database使用MySQL时,数据库/架构都会有一个字符集和一个排序规则。每个字符集都有一个默认排序规则;有关更多信息,请参见此处

字符集的默认排序规则latin1,是latin1_swedish_ci,不区分大小写。

您可以选择区分大小写的排序规则,例如latin1_general_csMySQL grammar):

CREATE SCHEMA IF NOT EXISTS `myschema` 
DEFAULT CHARACTER SET latin1 
COLLATE latin1_general_cs ;

这会影响分组和相等性。例如,

create table casetable (
  id int primary key, 
  thing varchar(50)
);

select * from casetable;
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

在区分大小写的数据库中,我们得到:

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| ABC   |        1 |
| aBc   |        1 |
| abC   |        1 |
| abc   |        1 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
+----+-------+

在不区分大小写的数据库中,我们得到:

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| abc   |        4 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

请注意,您还可以在查询中更改排序规则。例如,在区分大小写的数据库中,我可以

select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

13

由于MySQL处于稳定的开发中,因此您始终应该提出疑问,说明您使用的是哪个版本的MySQL。

好的,回到您的问题:

在MySQL中的字符串函数始终是大小写敏感的,所以你可以使用任何的功能LOCATEPOSITIONINSTR

例如:

SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;

除最新的3.23.4之外,与正则表达式(RLIKEREGEXP)匹配的模式对于所有MySQL版本始终区分大小写。

例如:

SELECT phone FROM user WHERE user_name REGEXP 'term';

对于常规比较(=)和SQL模式匹配(LIKE),行为取决于所涉及的字段:

一种。CHARVARCHAR以及TEXT字段的所有变体均不区分大小写。

b。CHAR BINARYVARCHAR BINARY 并且BLOB字段的所有变体都区分大小写。

如果将(a)中的字段与(b)中的字段进行比较,则比较将区分大小写(区分大小写优先)。请参阅《 MySQL参考手册》的“ 7.2.7字符串类型”一章,并查找有关排序和比较的语句。

从V3.23.0开始,还可以使用强制转换运算符强制进行区分大小写的比较BINARY,而与所涉及字段的类型无关。请参见《 MySQL参考手册》的“ 7.3.7强制转换运算符”。

因此,您也可以更改user_name的类型,或者使用V3.23.x尝试类似的操作:

SELECT phone FROM user WHERE BINARY username LIKE '%term%';

1

我的情况下,我使用的是Access 2010,但我遇到了同样的问题,但解决方案有所不同:使用该StrComp()函数并将其返回值测试为零。

StrComp( thing, 'abc', 0) = 0

由于StrComp()返回-1如果第一个参数是“小”,1如果是“大”,而0如果是“平等”的时候StrComp()=0,你有一个区分大小写的匹配。

看到这里这里这里


0

无论字符集如何,这都将在MySQL中运行。根据结果​​选择“测试” REGEXP BINARY“测试”;放置“ BINARY”将强制进行二进制比较。


-2

尝试以下方法进行不敏感的搜索,它可以很好地运行并具有出色的性能:

"SELECT phone FROM user WHERE lower(user_name) like ".srtlower($username);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.