#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 Пожалуйста, добавьте awarning
в верхней части вашего ответа, указав, что разные варианты написания также могут иметь одинаковоеsoundex code
значение. Например, попробуйтеSELECT SOUNDEX('hello - world'), SOUNDEX('helo - world'), SOUNDEX('helllo : world'), SOUNDEX('hello : worrld')
. Кстати, ваш ответ в целом неверен (но может работать для OP) по той же причине; он может возвращать неправильные записи, которые звучат похоже2. Да, конечно, нужно знать, как работает функция, прежде чем использовать ее. У OP было требование выполнить определенный тип неточного сопоставления.