无法在 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