无法在 MySQL 中使用带有大量特殊字符 (%) 的 like 查询数据
Unable to query data using like with lots of special characters(%) in MySQL
我将下面的值插入给用户 table,
~\`!@%23$%^%26*()-=_+{}[]|\:;\"'<>?,./
然后用 like 查询它,什么也没有,但是 =
工作正确,请问为什么 LIKE
子句不起作用?
准备数据
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
insert into users(name) values('~`!@%23$%^%26*()-=_+{}[]|\\:;\"\'<>?,./');
insert into users(name) values('test');
查询
select * from users where name like '%~`!@%23$%^%26*()-=\_+{}[]|\\:;\"\'<>?,./%'; // Got nothing
select * from users where name='~`!@%23$%^%26*()-=_+{}[]|\\:;\"\'<>?,./'; // Got the inserted data
即使我转义了 %
和 _
,它仍然不起作用
select * from users where name like '%~`!@\%23$\%^\%26*()-=\_+{}[]|\\:;\"\'<>?,./%'; // Still got nothing
预期结果
执行时
select * from users where name like '%~`!@%23$%^%26*()-=\_+{}[]|\\:;\"\'<>?,./%'; // Got nothing
应该只得到这条记录
~\`!@%23$%^%26*()-=_+{}[]|\:;\"'<>?,./
你可以像这样使用concat(不确定MySQL或那里的其他数据库类型,但原理是相同的):
select * from users
where name like
'%' || '~`!@%23$%^%26*()-=\_+{}[]|\\:;\"\'<>?,./' || '%';
这里是dbfiddle
upd. 由于新行的新问题,我用 ESCAPE
.[= 修复了我的代码15=]
select *
from users
where name like
'%~`!@%23$#%^#%26*()-=\_+{}[]|\\:;\"\'<>?,./%' --<< escape # before % character
escape '#';
这里是new dbfiddle
您可以使用 INSTR:
SELECT * FROM users
WHERE INSTR(name, '~`!@%23$%^%26*()-=\_+{}[]|\\:;\"\'<>?,./') > 0
我将下面的值插入给用户 table,
~\`!@%23$%^%26*()-=_+{}[]|\:;\"'<>?,./
然后用 like 查询它,什么也没有,但是 =
工作正确,请问为什么 LIKE
子句不起作用?
准备数据
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
insert into users(name) values('~`!@%23$%^%26*()-=_+{}[]|\\:;\"\'<>?,./');
insert into users(name) values('test');
查询
select * from users where name like '%~`!@%23$%^%26*()-=\_+{}[]|\\:;\"\'<>?,./%'; // Got nothing
select * from users where name='~`!@%23$%^%26*()-=_+{}[]|\\:;\"\'<>?,./'; // Got the inserted data
即使我转义了 %
和 _
,它仍然不起作用
select * from users where name like '%~`!@\%23$\%^\%26*()-=\_+{}[]|\\:;\"\'<>?,./%'; // Still got nothing
预期结果
执行时
select * from users where name like '%~`!@%23$%^%26*()-=\_+{}[]|\\:;\"\'<>?,./%'; // Got nothing
应该只得到这条记录
~\`!@%23$%^%26*()-=_+{}[]|\:;\"'<>?,./
你可以像这样使用concat(不确定MySQL或那里的其他数据库类型,但原理是相同的):
select * from users
where name like
'%' || '~`!@%23$%^%26*()-=\_+{}[]|\\:;\"\'<>?,./' || '%';
这里是dbfiddle
upd. 由于新行的新问题,我用 ESCAPE
.[= 修复了我的代码15=]
select *
from users
where name like
'%~`!@%23$#%^#%26*()-=\_+{}[]|\\:;\"\'<>?,./%' --<< escape # before % character
escape '#';
这里是new dbfiddle
您可以使用 INSTR:
SELECT * FROM users
WHERE INSTR(name, '~`!@%23$%^%26*()-=\_+{}[]|\\:;\"\'<>?,./') > 0