Ответ 1
Вы можете использовать REGEXP
и [[:<:]]
и [[:>:]]
маркеры слов:
SELECT *
FROM table
WHERE keywords REGEXP '[[:<:]]rid[[:>:]]'
Я хотел бы написать SQL-запрос, который ищет ключевое слово в текстовом поле, но только если это "целое совпадение слов" (например, когда я ищу "rid", он не должен соответствовать "arid", но он должен соответствовать "избавиться".
Я использую MySQL.
К счастью, производительность не имеет особого значения в этом приложении, а размер базы данных и размер строки являются достаточно небольшими, но я бы предпочел сделать это в SQL, чем в PHP, управляющем им.
Вы можете использовать REGEXP
и [[:<:]]
и [[:>:]]
маркеры слов:
SELECT *
FROM table
WHERE keywords REGEXP '[[:<:]]rid[[:>:]]'
Найден ответ, чтобы предотвратить классическую границу слова [[::<::]]
, столкнувшись со специальными символами, например: @# $% ^ & *
Заменить..
SELECT *
FROM table
WHERE keywords REGEXP '[[:<:]]rid[[:>:]]'
С этим..
SELECT *
FROM table
WHERE keywords REGEXP '([[:blank:][:punct:]]|^)rid([[:blank:][:punct:]]|$)'
Последние совпадения (пробел, табуляция и т.д.) || (запятая, скобка и т.д.) || начало/конец строки. Более "законченный" совпадение слов.
Вы можете использовать like
с маркером подстановки, чтобы поймать возможности (в начале, в конце, в середине и в одиночку), что-то вроде этого должно быть достаточно:
выберите бла-бла-бла, где столбец похож на 'rid%' или столбец похож на '% rid' или столбец похож на '% rid%' или column = 'rid'
Используйте regexp с границами слов, но если вы хотите также поиск без учета акцента, обратите внимание, что REGEXP является однобайтовым оператором, поэтому не стоит ничего делать с сортировкой utf8_general_ci, совпадение не будет нечувствительным к акценту.
Чтобы совпадение не чувствительно к акценту и совпадению всего слова, укажите слово, написанное таким же образом, как (устарела) PHP-функция sql_regcase().
По факту:
utf8_general_ci позволяет сделать поиск (WHERE field = value) без учета регистра и ударения, но не позволяет указать совпадение всего слова (маркеры границ слов не распознаются)
LIKE позволяет выполнять поиск без учета регистра и ударения, но необходимо вручную указать все комбинации возможных символов границ слов (маркеры границ слов не распознаются)
границы слов [[: <:]] и [[:>:]] поддерживаются в REGEXP, который является однобайтовой функцией, поэтому не выполняет поиск без учета акцента.
Решение состоит в том, чтобы использовать REGEXP с границами слова и словом, измененным так, как это делает sql_regcase.
Используется на http://www.nonsolodiete.it
select * from table where Locate('rid ', FieldToSearch) > 0
or Locate(' rid', FieldToSearch) > 0
Это будет работать с поиском, когда ему предшествует или следует пробел, вы можете расширить подход, чтобы учитывать.,?! и т.д., но не изящно, но легко.
Это лучший ответ, который я придумал до сих пор:
SELECT * FROM table
WHERE keywords REGEXP '^rid[ $]' OR keywords REGEXP ' rid[ $]'
Я бы упростил это:
SELECT *
FROM table
WHERE keywords REGEXP '[^ ]rid[ $]'
но [^] имеет особое значение "НЕ пространство", а не "начало строки или пробел".
Как REGEXP сравнивается с несколькими условиями LIKE? (Не то, что производительность имеет значение в этом приложении.)