2015-01-05 2 views
3

UTF-8로 인코딩 된 데이터를 utf8 charset을 사용하도록 구성된 데이터베이스 테이블에 저장하려고합니다. 그러나 전체 텍스트 검색을 수행 할 때 비 분리 전의 단어와 일치하지 않습니다 공백MySQL 전체 텍스트 검색, 데이터 정렬 및 비 분리 공간

예를 들어, 문제의 서식을 지정하기 위해 B 형 간염에 깨지지 않는 공백이 있습니다.이 문자열은 간염을 검색 할 때 일치하지 않습니다.

CREATE TABLE `search` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `title` text COLLATE FULLTEXT KEY `title` (`title`), 
    PRIMARY KEY (`id`), 
    FULLTEXT KEY `title` (`title`), 
) ENGINE=MyISAM AUTO_INCREMENT=202337 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

이 쿼리는 아무 것도 반환하지 :

SELECT 
    title, 
    MATCH(title) AGAINST ('hepatitis') AS `titleScore` 
FROM 
    `search` 
WHERE 
    MATCH(title) AGAINST ("hepatitis") 
ORDER BY 
    `titleScore` DESC LIMIT 10; 

그러나이 쿼리는 반환 다음

SELECT 
    title 
FROM 
    search 
WHERE 
    title LIKE "%hepatitis%"; 

+-------------------------------------------------------------------------+ 
| title                 | 
+-------------------------------------------------------------------------+ 
| Comparison of drugs for chronic HBeAg-positive hepatitis B    | 
| Antivirals in chronic hepatitis C          | 
| Chronic hepatitis C             | 
| Antivirals for hepatitis C            | 
| Antivirals for hepatitis B            | 
| Other antivirals for hepatitis C          | 
| Chronic hepatitis B             | 
| Hepatitis A vaccine             | 
| Hepatitis B vaccine             | 
| Hepatitis B immunoglobulin            | 
| Hepatitis C virus protease inhibitors, see HCV-protease inhibitors | 
+-------------------------------------------------------------------------+ 

우리는 매뉴얼에 넣어하지 않았다 전체 텍스트 물건에 따르면 " "http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/full-text-revealed.html#breaking에서 전체 텍스트는 단어 요소로만 영숫자와 일치해야하므로 비 분리 공간에서 중단됩니다 (비 분리 공백 문자 자체를 명시 적으로 나타내지는 않지만). http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

는, 일본어 UTF-8 텍스트 전체 텍스트 MATCH 작업을 일본어 텍스트에서 단어가 ASCII 공백으로 구분 될 수 있음을주의해야한다 -

나는 MySQL의 설명서에 댓글을 발견했다 문자는 일본어 UTF-8 (또는 기타) 공백 문자가 아닙니다.

는 내가 함께, 새로운 데이터 정렬, following the MySQL manual을 만들었습니다 (데이터를 관리하는 phpMyAdmin을 사용시 /... 당신은 공간 문자를 삽입하는 일본어 IME에서 멀리 을 전환해야하는 SQL 쿼리를 쓰기) 다음과 같은 규칙 :

<charset name="utf8"> 
    ... 
    <collation name="utf8_custom" id="1001"> 
    <rules> 
     <reset>\u0020</reset> <!-- ascii space character --> 
     <i>\u00A0</i>   <!-- non-breaking space --> 
     <reset>A</reset>  <!-- test --> 
     <i>B</i> 
    </rules> 
    </collation> 
</charset> 

은 내가 다음 새 데이터 정렬을 사용하고 수리가 테이블을 사용하여 인덱스를 재 구축하기 위해 테이블을 변경하여 서버를 재시작 한 후 정렬이 show collation like 'utf8_custom';

사용할 수 있었다 확인 좋은 척도.

여전히

SELECT title FROM search WHERE "Hepatitis A vaccine"; 반환하지 않습니다 결과

SELECT title FROM search WHERE "Hepatitis A vaccine";는 결과를 반환하지 않습니다 - 두 가지 사실 :

+------------------------+ 
| title     | 
+------------------------+ 
| Hepatitis A vaccine | 
| Hepatitis B vaccine | 
+------------------------+ 

을 이것은 동일한 정렬하고 B의 규칙이 영광되고 있음을 보여주고 있지만, 비 분리 공간은 그렇지 않습니다.

Â은 나를 귀찮게합니다. 내 테이블은 utf8이고 내 클라이언트는 utf8이고 원본 데이터는 utf8입니다. 나는이 캐릭터를보아야하는지 확신하지 못한다.

+1

해시 태그 (인덱스의 # 기호 포함)에 대한 MySQL 전체 텍스트 검색 가능 (http://stackoverflow.com/questions/21296870/mysql-full-text-search-for-hashtags-including- the-symbol-in-index) (다른 질문은 단어 분리 기호를 정규 문자로 취급하는 방법을 물었습니다. 이것은 질문의 정반대입니다). – RandomSeed

+0

고맙습니다. 감사합니다. - 새로운 데이터 정렬을 만드는 것이 아마도 우리가가는 길일 것이라고 생각 합니다만, 마감일이 가까워지면서 나는 검색 코퍼스에서 비 ASCII 문자를 필터링했습니다 – HorusKol

답변

1

문제는 검색 데이터가 데이터베이스에 기록되는 단계입니다.(또는 Zend/PDO 상당)을 발행하여 utf8 테이블로 전송되는 utf8 문자열이 다음과 같이 전송되었는지 확인해야했습니다. utf8.

의 내 Zend application.ini에서 데이터베이스 구성에 매개 변수를 추가하면이 문제가 해결됩니다.

관련 문제