Поиск слова "целое слово" в MySQL

Я хотел бы написать SQL-запрос, который ищет ключевое слово в текстовом поле, но только если это "целое совпадение слов" (например, когда я ищу "rid", он не должен соответствовать "arid", но он должен соответствовать "избавиться".

Я использую MySQL.

К счастью, производительность не имеет особого значения в этом приложении, а размер базы данных и размер строки являются достаточно небольшими, но я бы предпочел сделать это в SQL, чем в PHP, управляющем им.

Ответ 1

Вы можете использовать REGEXP и [[:<:]] и [[:>:]] маркеры слов:

SELECT *
FROM table 
WHERE keywords REGEXP '[[:<:]]rid[[:>:]]'

Ответ 2

Найден ответ, чтобы предотвратить классическую границу слова [[::<::]], столкнувшись со специальными символами, например: @# $% ^ & *

Заменить..

SELECT *
FROM table 
WHERE keywords REGEXP '[[:<:]]rid[[:>:]]'

С этим..

SELECT *
FROM table 
WHERE keywords REGEXP '([[:blank:][:punct:]]|^)rid([[:blank:][:punct:]]|$)'

Последние совпадения (пробел, табуляция и т.д.) || (запятая, скобка и т.д.) || начало/конец строки. Более "законченный" совпадение слов.

Ответ 3

Вы можете использовать like с маркером подстановки, чтобы поймать возможности (в начале, в конце, в середине и в одиночку), что-то вроде этого должно быть достаточно:

выберите бла-бла-бла, где столбец похож на 'rid%' или столбец похож на '% rid' или столбец похож на '% rid%' или column = 'rid'

Ответ 4

Используйте regexp с границами слов, но если вы хотите также поиск без учета акцента, обратите внимание, что REGEXP является однобайтовым оператором, поэтому не стоит ничего делать с сортировкой utf8_general_ci, совпадение не будет нечувствительным к акценту.

Чтобы совпадение не чувствительно к акценту и совпадению всего слова, укажите слово, написанное таким же образом, как (устарела) PHP-функция sql_regcase().

По факту:

  • utf8_general_ci позволяет сделать поиск (WHERE field = value) без учета регистра и ударения, но не позволяет указать совпадение всего слова (маркеры границ слов не распознаются)

  • LIKE позволяет выполнять поиск без учета регистра и ударения, но необходимо вручную указать все комбинации возможных символов границ слов (маркеры границ слов не распознаются)

  • границы слов [[: <:]] и [[:>:]] поддерживаются в REGEXP, который является однобайтовой функцией, поэтому не выполняет поиск без учета акцента.

Решение состоит в том, чтобы использовать REGEXP с границами слова и словом, измененным так, как это делает sql_regcase.

Используется на http://www.nonsolodiete.it

Ответ 5

select * from table where Locate('rid ', FieldToSearch) > 0 
      or Locate(' rid', FieldToSearch) > 0

Это будет работать с поиском, когда ему предшествует или следует пробел, вы можете расширить подход, чтобы учитывать.,?! и т.д., но не изящно, но легко.

Ответ 6

Это лучший ответ, который я придумал до сих пор:

SELECT * FROM table 
WHERE keywords REGEXP '^rid[ $]' OR keywords REGEXP ' rid[ $]'

Я бы упростил это:

SELECT *
FROM table
WHERE keywords REGEXP '[^ ]rid[ $]'

но [^] имеет особое значение "НЕ пространство", а не "начало строки или пробел".

Как REGEXP сравнивается с несколькими условиями LIKE? (Не то, что производительность имеет значение в этом приложении.)