Som*_*luk 24 mysql select case-sensitive
我想在 SQL 查询中进行区分大小写的搜索。但默认情况下,MySQL 不考虑字符串的情况。
关于如何在 SQL 查询中进行区分大小写的搜索的任何想法?
Mat*_*ick 24
默认情况下,MySQL 不考虑字符串的大小写
这并不完全正确。无论何时create database
在 MySQL 中,数据库/模式都有一个字符集和一个排序规则。每个字符集都有一个默认的排序规则;请参阅此处了解更多信息。
字符集的默认排序latin1
,这是latin1_swedish_ci
,恰好是不区分大小写的。
您可以选择区分大小写的排序规则,例如latin1_general_cs
(MySQL 语法):
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中的字符串函数始终是大小写敏感的,所以你可以使用任何的功能LOCATE
,POSITION
或INSTR
。
例如:
SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;
Run Code Online (Sandbox Code Playgroud)
除了最新的 3.23.4 之外,所有 MySQL 版本的正则表达式 ( RLIKE
or 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'
二进制比较。
归档时间: |
|
查看次数: |
107156 次 |
最近记录: |