ProgramingTip

MySQL에서 "전체 단어 일치"검색

bestdevel 2020. 11. 3. 08:22
반응형

MySQL에서 "전체 단어 일치"검색


텍스트 필드에서 키워드를 검색하는 SQL 쿼리를 작성하고 싶지만 "전체 단어 일치"인 경우에만 해당됩니다 (예 : "rid"를 검색 할 때 "arid"와 일치하지 않지만 "Remove"와 일치합니다.

MySQL을 사용하고 있습니다.

많은 것이 응용 프로그램에서는 성능이 중요하지 않습니다 데이터베이스 크기와 크기가 모두 편안하게 작지만 PHP를 구동하는 것보다 SQL에서 수행하는 것이 좋습니다.


당신은 사용할 수 있습니다 . 단어 경계 마커 :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와일드 카드 마커와 함께 사용 하여 가능성 (시작, 끝, 중간 및 단독)을 사용할 수 있습니다 . 다음과 같은 충분합니다.

blah blah blah where 'rid %'와 같은 열 또는 '% rid'와 같은 열 또는 '% rid %'와 같은 열 또는 column = 'rid'


경계와 함께 regexp를 사용하지만 악센트를 구분하지 않는 검색도 원할 경우 REGEXP는 단일 문자 연산자 단어 utf8_general_ci 데이터 정렬을 의미하지 않습니다. 일치는 악센트를 구분하지 않습니다.

악센트를 구분하지 않고 전체 단어를 일치 시키려면 (더 이상 사용하지 않는) PHP 함수 sql_regcase ()와 동일한 방식으로 단어를 지정하십시오.

사실로 :

  • utf8_general_ci를 사용하면 대소 문자를 동일하게 (WHERE = 값) 검색 할 수있는 단어 일치를 줄 수는 없습니다 (단어 경계가 인식되지 않습니다).

  • 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 조건과 어떻게 비교 검증? (이 앱에서는 성능이 중요하지 않습니다.)

참고 URL : https://stackoverflow.com/questions/656951/search-for-whole-word-match-in-mysql

반응형