MySQL LIKE 区分大小写,但我不希望它是
MySQL LIKE is case sensitive but I don't want it to be
据我了解,MySQL LIKE 应该不区分大小写。我看过的所有地方都提供了有关如何在需要时区分大小写的说明。我的好像是区分大小写的,但是我不希望它是
这导致我的身份验证服务器出现问题,在对用户进行身份验证时需要不区分大小写。请让我知道如何解决这个问题,或者我如何弄清楚为什么 LIKE 在这里区分大小写。
你试过吗?
SELECT users_user.username FROM users_user WHERE users_user.username LIKE '%DEMO1-0048%'
区分大小写基于您正在搜索的列的排序规则,在您的 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)
或者如果我使用区分大小写的排序规则定义 table:
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)
所以我推断您的 table 是使用区分大小写的排序规则定义的。你可以检查这个:
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 |
+--------------------+----------------+
您可以强制字符串比较不区分大小写,即使为 table/column 定义的默认排序规则是区分大小写的。
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 |
+------------+
您可以将查询转换为大写,以便它们匹配,
SELECT * FROM users_user WHERE UPPER(username) LIKE UPPER('%DeMO1-0048%');
据我了解,MySQL LIKE 应该不区分大小写。我看过的所有地方都提供了有关如何在需要时区分大小写的说明。我的好像是区分大小写的,但是我不希望它是
这导致我的身份验证服务器出现问题,在对用户进行身份验证时需要不区分大小写。请让我知道如何解决这个问题,或者我如何弄清楚为什么 LIKE 在这里区分大小写。
你试过吗?
SELECT users_user.username FROM users_user WHERE users_user.username LIKE '%DEMO1-0048%'
区分大小写基于您正在搜索的列的排序规则,在您的 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)
或者如果我使用区分大小写的排序规则定义 table:
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)
所以我推断您的 table 是使用区分大小写的排序规则定义的。你可以检查这个:
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 |
+--------------------+----------------+
您可以强制字符串比较不区分大小写,即使为 table/column 定义的默认排序规则是区分大小写的。
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 |
+------------+
您可以将查询转换为大写,以便它们匹配,
SELECT * FROM users_user WHERE UPPER(username) LIKE UPPER('%DeMO1-0048%');