Поиск в MySQL без каких-либо специальных символов

#php #mysql

#php #mysql

Вопрос:

Мне интересно, возможно ли выполнить поиск по полю MySQL, где в поле может быть что-то вроде этого:

 test - hello
 

но у вас есть строка от пользователя

 test: hello
 

Очевидно, что на стороне PHP легко удалить из строки любые специальные символы, подобные этому, но возможно ли выполнять поиск по строкам MySQL и игнорировать специальные символы?

Комментарии:

1. в основном используйте полнотекстовый индекс. в противном случае, нет, вы не можете «игнорировать» символы. это то, что должен делать ваш код, а не mysql.

Ответ №1:

Еще одно уникальное решение — поместить подстановочные знаки между каждым словом. До тех пор, пока поисковая фраза не содержит специальных символов, будут возвращены правильные результаты при игнорировании любых специальных символов в результатах.

Например…

 SELECT *
FROM myTable
WHERE somefield LIKE '%test%hello%'
 

Ответ №2:

Это может быть возможно, если вы найдете и замените все такие специальные символы и пробелы из столбца пользовательского ввода, т. е.

 select * from tablename where replace(replace(columnname,' ',''),':',''),'-','')=replace(replace([USER INPUT],' ',''),':',''),'-','');
 

Комментарии:

1. Хммм, это довольно новый подход, может попробовать, спасибо!

Ответ №3:

Вы можете «игнорировать» специальные символы, пробелы и т. Д., Используя SOUNDEX() функцию:

 mysql> select soundex('test - hello'), soundex('test: hello');
 ------------------------- ------------------------ 
| soundex('test - hello') | soundex('test: hello') |
 ------------------------- ------------------------ 
| T234                    | T234                   |
 ------------------------- ------------------------ 
 

Таким образом, вы можете искать свои данные следующим образом:

 SELECT ...
FROM MyTable
WHERE SOUNDEX(somefield) = SOUNDEX('test: hello');
 

Это вообще не будет индексироваться, поэтому он будет вынужден выполнить сканирование таблицы. Если вы используете MySQL 5.7, вы можете добавить виртуальный столбец для выражения soundex и проиндексировать этот виртуальный столбец. Это значительно повысило бы производительность.

Комментарии:

1. Люди без знаний SOUNDEX , БУДЬТЕ ОСТОРОЖНЫ! @BillKarwin Пожалуйста, добавьте a warning в верхней части вашего ответа, указав, что разные варианты написания также могут иметь одинаковое soundex code значение. Например, попробуйте SELECT SOUNDEX('hello - world'), SOUNDEX('helo - world'), SOUNDEX('helllo : world'), SOUNDEX('hello : worrld') . Кстати, ваш ответ в целом неверен (но может работать для OP) по той же причине; он может возвращать неправильные записи, которые звучат похоже

2. Да, конечно, нужно знать, как работает функция, прежде чем использовать ее. У OP было требование выполнить определенный тип неточного сопоставления.