我想要在SQL查询中区分大小写的搜索。但是默认情况下,MySQL不考虑字符串的大小写。
关于如何在SQL查询中进行区分大小写的搜索的任何想法?
我想要在SQL查询中区分大小写的搜索。但是默认情况下,MySQL不考虑字符串的大小写。
关于如何在SQL查询中进行区分大小写的搜索的任何想法?
Answers:
默认情况下,MySQL不考虑字符串的大小写
这不是真的。每当您create database
使用MySQL时,数据库/架构都会有一个字符集和一个排序规则。每个字符集都有一个默认排序规则;有关更多信息,请参见此处。
字符集的默认排序规则latin1
,是latin1_swedish_ci
,不区分大小写。
您可以选择区分大小写的排序规则,例如latin1_general_cs
(MySQL 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 |
+----+-------+
由于MySQL处于稳定的开发中,因此您始终应该提出疑问,说明您使用的是哪个版本的MySQL。
好的,回到您的问题:
在MySQL中的字符串函数始终是大小写敏感的,所以你可以使用任何的功能LOCATE
,POSITION
或INSTR
。
例如:
SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;
除最新的3.23.4之外,与正则表达式(RLIKE
或REGEXP
)匹配的模式对于所有MySQL版本始终区分大小写。
例如:
SELECT phone FROM user WHERE user_name REGEXP 'term';
对于常规比较(=)和SQL模式匹配(LIKE
),行为取决于所涉及的字段:
一种。CHAR
,VARCHAR
以及TEXT字段的所有变体均不区分大小写。
b。CHAR BINARY
,VARCHAR 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%';