85 votes

Recherche de "mots entiers" dans MySQL

J'aimerais écrire une requête SQL qui recherche un mot clé dans un champ de texte, mais uniquement s'il s'agit d'une "correspondance de mot entier" (par exemple, lorsque je recherche "débarrasser", il ne doit pas correspondre à "aride", mais correspond à "un débarrasser".

J'utilise MySQL.

Heureusement, les performances ne sont pas critiques dans cette application, et la taille de la base de données et la taille de la chaîne de caractères sont toutes deux relativement petites, mais je préférerais le faire en SQL plutôt qu'en PHP.

165voto

LukeH Points 110965

Vous pouvez utiliser REGEXP et les marqueurs de limite de mot [[:<:]] et [[:>:]] :

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

34voto

toxinhead Points 141

Nous avons trouvé une réponse pour empêcher la limite de mots classique [[::<::]] entrer en conflit avec des caractères spéciaux, par exemple. @ # $% ^ & *

Remplacer..

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

Avec ça..

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

Ce dernier correspond (espace, tabulation, etc.) || (virgule, support, etc.) || début / fin de ligne. Une correspondance de limite de mot plus "terminée".

4voto

Marco Marsala Points 128

Utiliser regexp avec les limites des mots, mais si vous voulez aussi insensible aux accents de recherche, veuillez noter que les REGEXP est un octet de l'opérateur, de sorte qu'il ne Vaut rien avoir interclassement utf8_general_ci, le match ne sera pas insensible aux accents.

Pour avoir à la fois insensible aux accents et tout le mot de match, spécifiez le mot écrit de la même manière l' (obsolète) fonction PHP sql_regcase() n'.

En fait:

  • utf8_general_ci vous permet de faire une égalité (OÙ le champ = valeur) cas et insensible aux accents de recherche, mais elle ne vous permet pas de spécifier un mot de match (les limites de mot de marqueurs n'est pas reconnu)

  • COMME vous permet de cas et insensible aux accents de recherche, mais vous devez spécifier manuellement toutes les combinaisons de mots possibles limites charactes (les limites de mot de marqueurs n'est pas reconnu)

  • les limites de mot [[:<:]] et [[:>:]] sont pris en charge dans les REGEXP, qui est un seul octet fonctions afin de ne pas effectuer insensible aux accents de recherche.

La solution est d'utiliser REGEXP avec les limites des mots et de la parole modifiée de la manière sql_regcase n'.

Utilisé sur http://www.genovaperte.it

4voto

paxdiablo Points 341644
select blah blah blah
where column like 'rid %'
   or column like '% rid'
   or column like '% rid %'
   or column =    'rid'

1voto

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

Cela gérera de trouver où il est précédé ou suivi d’un espace, vous pouvez étendre l’approche pour prendre en compte.,?! et ainsi de suite, pas élégant mais facile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X