복붙노트

[SQL] MySQL의에서 "전체 단어 일치"검색

SQL

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

나는 SQL 쿼리를 작성하는 싶습니다 텍스트 필드에 키워드를 검색하지만, 내가 "제거"를 검색하면 "전체 단어 일치"(예를 들어, 그것은 "건조한"를 일치하지해야하지만해야 경우에만 의 "제거"일치합니다.

내가 MySQL을 사용하고 있습니다.

다행히, 성능이 응용 프로그램에서 중요하지 않습니다, 데이터베이스 크기와 문자열 크기는 모두 편안하게 작은,하지만 난 그것을 구동 PHP에 비해 SQL에서 그것을 할 것을 선호합니다.

해결법

  1. ==============================

    1.당신이 사용할 수있는 정규 표현식과 [[: <:]]과 [[:> :]] 단어 경계 마커 :

    당신이 사용할 수있는 정규 표현식과 [[: <:]]과 [[:> :]] 단어 경계 마커 :

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

    2020 용 업데이트 (실제로 2018+를)

    당신은 지금 "표준"단어 경계 마커 \ B를 사용해야합니다, 그래서 MySQL은, 버전 8.0.4에서의 정규식 엔진을 업데이트 :

    SELECT *
    FROM table 
    WHERE keywords REGEXP '\\brid\\b'
    

    또한 두 번째 백 슬래시를 넣어 백 슬래시를 이스케이프 할 필요가 있음을 유의하십시오.

  2. ==============================

    2.고전적인 단어 경계를 방지하기 위해 답을 찾을 수 [[:: <::]] 특수 문자와 충돌 예. @ # $ % ^ & *

    고전적인 단어 경계를 방지하기 위해 답을 찾을 수 [[:: <::]] 특수 문자와 충돌 예. @ # $ % ^ & *

    바꾸다..

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

    이에 ..

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

    후자의 일치 (공백, 탭 등) || (쉼표, 브라켓 등) || 라인의 시작 / 끝. 더 '완성'단어 경계를 일치합니다.

  3. ==============================

    3.당신은 이런 일이 충분해야 (단독 중간, 끝, 시작 등) 가능성을 잡기 위해 와일드 카드 마커처럼 사용할 수 있습니다 :

    당신은 이런 일이 충분해야 (단독 중간, 끝, 시작 등) 가능성을 잡기 위해 와일드 카드 마커처럼 사용할 수 있습니다 :

    선택 ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ     여기서 '제거 %'와 같은 열        나 같은 열 '%는 제거'        또는 '% 제거 %'와 같은 열        또는 열 = '제거'

  4. ==============================

    4.이 utf8_general_ci 데이터 정렬을 가지고 워스 아무것도 아니다, 그래서 당신은 또한 문자를 구분 검색 정규 표현식은 단일 바이트 운영자입니다, 제발주의를 강조하려는 경우 단어 경계를 사용하여 정규 표현식하지만, 경기는 악센트를 구분하지 않습니다.

    이 utf8_general_ci 데이터 정렬을 가지고 워스 아무것도 아니다, 그래서 당신은 또한 문자를 구분 검색 정규 표현식은 단일 바이트 운영자입니다, 제발주의를 강조하려는 경우 단어 경계를 사용하여 정규 표현식하지만, 경기는 악센트를 구분하지 않습니다.

    악센트를 구분하고 전체 단어 일치 모두를 위해, 같은 방법으로 (사용되지 않음) PHP 함수 sql_regcase 서면 단어를 지정 ()했다.

    사실로:

    이 솔루션은 단어 경계와 sql_regcase가하는 방식으로 수정 단어와 정규 표현식을 사용하는 것입니다.

    http://www.nonsolodiete.it에 사용

  5. ==============================

    5.

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

    이 앞에 또는 뒤에 공백 곳이 제거 찾는 처리합니다, 당신이 고려하는 접근 방식을 확장 할 수 있습니다.?! 등, 우아하지만 쉽지 않다.

  6. ==============================

    6.이것은 내가 지금까지와 자신을 왔어요 최고의 답변입니다 :

    이것은 내가 지금까지와 자신을 왔어요 최고의 답변입니다 :

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

    나는 그것을 단순화 것입니다 :

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

    하지만, [^]이 아니라 "라인 시작 또는 공간"보다 "NOT 공간"의 특별한 의미를 가지고있다.

    어떻게 정규 표현식은 여러 LIKE 조건 비교합니까? (성능이 응용 프로그램에서 중요하지 않는 것이.)

  7. from https://stackoverflow.com/questions/656951/search-for-whole-word-match-in-mysql by cc-by-sa and MIT license