我将UTF-8编码数据放入配置为使用utf8字符集的数据库表中,但是当我进行全文搜索时,它在不间断空格之前与该字匹配。
例如,对于格式化问题,我们在乙型肝炎中有一个不间断的空间。在寻找肝炎时,这个字符串不匹配。
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全文中“我们没有放入手册的全文”,全文应该只将字母数字作为单词元素匹配,因此在不间断的空间中打破(尽管它没有明确说明不间断的空格字符本身。)
我确实在MySQL手册上找到了评论 - http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html
要使FULLTEXT MATCH与日文UTF-8文本一起使用,请注意 日语文本中的单词由 ASCII 空格分隔 字符,而不是日语UTF-8(或其他)间距字符。 (什么时候 使用phpMyAdmin来管理数据/编写SQL查询,必须切换 远离日语IME插入空格char ...)
我使用以下规则创建了新的排序规则following the MySQL manual:
<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与A相同的校对中的规则得到尊重,但不打破空间的规则。
Â
困扰我 - 我的表是utf8,我的客户端是utf8,源数据是utf8。我不确定我应该看到这个角色。
答案 0 :(得分:1)
问题是将搜索数据写入数据库的步骤 - 我必须发出SET NAMES "utf8"
(或等效的Zend / PDO)以确保将utf8字符串发送到utf8表是以utf8运输的。
在我的Zend application.ini中为charset = 'utf8'
添加参数到我的数据库配置解决了这个问题。