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입니다. 나는이 캐릭터를보아야하는지 확신하지 못한다.
해시 태그 (인덱스의 # 기호 포함)에 대한 MySQL 전체 텍스트 검색 가능 (http://stackoverflow.com/questions/21296870/mysql-full-text-search-for-hashtags-including- the-symbol-in-index) (다른 질문은 단어 분리 기호를 정규 문자로 취급하는 방법을 물었습니다. 이것은 질문의 정반대입니다). – RandomSeed
고맙습니다. 감사합니다. - 새로운 데이터 정렬을 만드는 것이 아마도 우리가가는 길일 것이라고 생각 합니다만, 마감일이 가까워지면서 나는 검색 코퍼스에서 비 ASCII 문자를 필터링했습니다 – HorusKol