MySQL LIKE 区分大小写,但我不希望它是 [重复]

Posted

技术标签:

【中文标题】MySQL LIKE 区分大小写,但我不希望它是 [重复]【英文标题】:MySQL LIKE is case sensitive but I don't want it to be [duplicate] 【发布时间】:2021-05-26 05:17:27 【问题描述】:

据我了解,mysql LIKE 应该不区分大小写。我看过的所有地方都提供了有关如何在需要时使其区分大小写的说明。我的似乎区分大小写,但我不希望它是

这导致我的身份验证服务器出现问题,在对用户进行身份验证时需要不区分大小写。请让我知道如何解决此问题,或者我如何弄清楚为什么 LIKE 在这里区分大小写。

【问题讨论】:

【参考方案1】:

区分大小写基于您正在搜索的列的排序规则,在您的 CREATE TABLE 中定义,或者会话的排序规则,它确定字符串文字的字符集和排序规则。

例子:

CREATE TABLE `users_user` (
  `username` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

insert into users_user set username='DEMO1-0048';

这里我们看到 utf8mb4_general_ci 的默认排序规则不区分大小写:

mysql> select * from users_user where username like 'DeMO1-0048';
+------------+
| username   |
+------------+
| DEMO1-0048 |
+------------+

但如果我强制列使用区分大小写的排序规则:

mysql> select * from users_user where username collate utf8mb4_bin like 'DeMO1-0048';
Empty set (0.00 sec)

或者如果我强制字符串文字使用不区分大小写的排序规则:

mysql> select * from users_user where username like 'DeMO1-0048' collate utf8mb4_bin;
Empty set (0.00 sec)

或者,如果我使用区分大小写的排序规则定义表:

CREATE TABLE `users_user` (
  `username` text COLLATE utf8mb4_bin
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

insert into users_user set username='DEMO1-0048';

mysql> select * from users_user where username like 'DeMO1-0048';
Empty set (0.00 sec)

所以我会推断您的表是使用区分大小写的排序规则定义的。你可以检查一下:

mysql> select character_set_name, collation_name from information_schema.columns where table_name='users_user' and column_name='username';
+--------------------+----------------+
| character_set_name | collation_name |
+--------------------+----------------+
| utf8mb4            | utf8mb4_bin    |
+--------------------+----------------+

您可以强制字符串比较不区分大小写,即使为表/列定义的默认排序规则区分大小写。

mysql> select * from users_user where username like 'DeMO1-0048' collate utf8mb4_general_ci;
+------------+
| username   |
+------------+
| DEMO1-0048 |
+------------+

如果您在列上也使用collate 选项,这将有效:

mysql> select * from users_user where username collate utf8mb4_general_ci like 'DeMO1-0048';
+------------+
| username   |
+------------+
| DEMO1-0048 |
+------------+

【讨论】:

就是这样。我的排序规则显示为 utf8m4_bin。现在我的表中有很多数据,所以我宁愿不必重新创建它,所以我咨询了***.com/questions/1294117/…,以了解如何在不重新创建表的情况下更改排序规则。【参考方案2】:

你试过了吗?

SELECT users_user.username FROM users_user WHERE users_user.username LIKE '%DEMO1-0048%'

【讨论】:

SELECT users_user.username FROM users_user WHERE users_user.username LIKE '%DEMO1-0048%' 将找到 DEMO1-0048,因为它是正确的大小写。但是我尝试了 SELECT users_user.username FROM users_user WHERE users_user.username LIKE '%DEmO1-0048%' ,但我仍然得到空集。希望能够以小写字母输入我的用户名,并且仍然获得用户名大写的用户。【参考方案3】:

您可以将查询转换为大写,以便它们匹配,

SELECT * FROM users_user WHERE UPPER(username) LIKE UPPER('%DeMO1-0048%');

【讨论】:

以上是关于MySQL LIKE 区分大小写,但我不希望它是 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

我正在为不和谐的机器人编写代码,如果字符串不区分大小写,我希望这样,但我不知道如何

MySQL - 模糊搜索 LIKE BINARY 和 LIKE

如何使 LIKE 表现得不区分大小写?

MySql-LIKE用法

mysql模糊查询区分大小写

SQL语句中模糊查询中不区分大小写怎么写?如:select × from table where number like‘%PK%’