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

Som*_*luk 24 mysql select case-sensitive

我想在 SQL 查询中进行区分大小写的搜索。但默认情况下,MySQL 不考虑字符串的情况。

关于如何在 SQL 查询中进行区分大小写的搜索的任何想法?

Mat*_*ick 24

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

这并不完全正确。无论何时create database在 MySQL 中,数据库/模式都有一个字符集和一个排序规则。每个字符集都有一个默认的排序规则;请参阅此处了解更多信息。

字符集的默认排序latin1,这是latin1_swedish_ci,恰好是不区分大小写的。

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

CREATE SCHEMA IF NOT EXISTS `myschema` 
DEFAULT CHARACTER SET latin1 
COLLATE latin1_general_cs ;
Run Code Online (Sandbox Code Playgroud)

这对分组和平等等事情有影响。例如,

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

select * from casetable;
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+
Run Code Online (Sandbox Code Playgroud)

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

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   |
+----+-------+
Run Code Online (Sandbox Code Playgroud)

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

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   |
+----+-------+
Run Code Online (Sandbox Code Playgroud)

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

select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+
Run Code Online (Sandbox Code Playgroud)


小智 16

你总是应该在你的问题中说明你使用的是哪个版本的 MySQL,因为 MySQL 正在稳定发展。

好的,回到你的问题:

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

例如:

SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;
Run Code Online (Sandbox Code Playgroud)

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

例如:

SELECT phone FROM user WHERE user_name REGEXP 'term';
Run Code Online (Sandbox Code Playgroud)

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

一种。CHAR, VARCHAR, 和 TEXT 字段的所有变体都比较不区分大小写。

CHAR BINARY,VARCHAR BINARY 并且 BLOB 字段的所有变体都比较区分大小写。

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

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

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

SELECT phone FROM user WHERE BINARY username LIKE '%term%';
Run Code Online (Sandbox Code Playgroud)


小智 6

无论字符集如何,这都可以在 MySQL 中运行。

SELECT 'test' REGEXP BINARY 'TEST' AS RESULT;
Run Code Online (Sandbox Code Playgroud)

强制进行'BINARY'二进制比较。