Невозможно запросить данные с использованием большого количества специальных символов (%) в MySQL

Я вставил значение ниже в таблицу пользователей,

~\`!@%23$%^%26*()-=_+{}[]|\\:;\"'<>?,./

затем запросите его, например, ничего не получил, однако = работает правильно, почему предложение 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*()-=_+{}[]|\\:;\"'<>?,./

пожалуйста, отметьте тип вашей базы данных

Skalpel02 17.05.2022 10:25

@Skalpel02 отредактировал плитку.

Vidy Videni 17.05.2022 10:37

@vidyVideni Я добавил решение для MySQL, надеюсь, оно поможет

Jesusbrother 17.05.2022 10:44
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
3
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать concat следующим образом (не уверен, что там MySQL или другой тип БД, но принцип тот же):

select * from users 
where name like
'%' || '~`!@%23$%^%26*()-=\_+{}[]|\\\\:;\\"\'<>?,./' || '%';

Вот dbfiddle

обновление Из-за новой проблемы с новыми строками я исправил свой код с помощью ESCAPE.

select *
from users 
where name like 
 '%~`!@%23$#%^#%26*()-=\_+{}[]|\\\\:;\\"\'<>?,./%' --<< escape # before % character
escape '#';

Вот новый dbfiddle

Хороший ответ, спасибо. Я просто хочу добавить в БД SQL Server, что вам нужно использовать + вместо ||. Но OP, похоже, не использует SQL Server, так что это должно сработать.

Jonas Metzler 17.05.2022 10:48

Извините, это не работает должным образом, оно вернет другие записи, не соответствующие ~`!@%23$%^%26*()-=_+{}[]|\\:;\"'<>? ,./

Vidy Videni 17.05.2022 11:00

@JonasMetzler, пожалуйста, попробуйте вставить другой необработанный файл, например, вставьте в user(name) values('test');

Vidy Videni 17.05.2022 11:03

Кажется, MySQL лечит || как или, а не строку concat, я попробовал CONCAT('%', '~`!@%23$%^%26*()-=_+{}[]|\\\\:;\\"\ '<>?,./', '%') не повезло.

Vidy Videni 17.05.2022 11:11

@vidyvideni Причина в том, что ваша строка содержит знак %, который скомпилирован как «набор любых символов любой длины». Нужно экранировать этот символ в запросе, смотрите обновленный код

Jesusbrother 17.05.2022 11:31

@Jesusbrother, ха-ха, я пробовал использовать пункт escape раньше, я не ожидал, нам нужно использовать и #, и `\`, чтобы избежать. Благодарю.

Vidy Videni 17.05.2022 11:38

Вы можете использовать INSTR:

SELECT * FROM users 
WHERE INSTR(name, '~`!@%23$%^%26*()-=\_+{}[]|\\\\:;\\"\'<>?,./') > 0 

Да, ваше решение работает, можете ли вы также объяснить, почему подобное не работает, пожалуйста.

Vidy Videni 17.05.2022 11:19

Я не сторонник использования лайков для таких сложных условий и не использую их очень часто. Может быть, это можно как-то сделать, используя like (я предположил, что ответ выше должен подойти), но я думаю, что это какой-то странный синтаксис, и INSTR проще.

Jonas Metzler 17.05.2022 11:24

Отличный обходной путь. В этом случае производительность для обоих одинакова. Приведенный выше ответ не работает должным образом, поскольку возвращает все записи.

Vidy Videni 17.05.2022 11:30

выше работает сейчас

Vidy Videni 17.05.2022 11:39

Другие вопросы по теме