1

我的查询显示如下:

SELECT advert_id
FROM oop_adverts
WHERE cat_down = :id 
  AND province = :province
  AND MATCH (location) AGAINST (:location);

在实践中:

SELECT advert_id 
FROM oop_adverts 
WHERE cat_down = 3 
  AND province = 5 
  AND MATCH (location) AGAINST ('Krakow');

如果我尝试这个查询,mysql 最终得到 0 个结果。问题是查询中的波兰语短语。当我将此查询替换为:

SELECT advert_id 
FROM oop_adverts 
WHERE cat_down = 3
    AND province = 5 
    AND MATCH (location) AGAINST ('Krakow') COLLATE utf8_unicode_ci;`

我有:

Syntax error or access violation: 1253 COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'binary''

我不知道我应该在脚本 php 和 mysql 中使用什么排序规则。你能帮助我吗?

PS。对不起我的“最好的英语”兄弟。

4

2 回答 2

2

什么是表架构?

我猜“位置”被定义为二进制字符串,不能使用像 utf8_unicode_ci 这样的排序规则进行比较。在这里阅读以获取更多信息。

http://dev.mysql.com/doc/refman/5.0/en/charset-binary-collat​​ions.html

编辑:

告诉我们您的架构以获得进一步的帮助。但是尝试这样的事情:

SELECT advert_id 
FROM oop_adverts 
WHERE cat_down = 3 
  AND province = 5 
  AND MATCH (CONVERT(BINARY(location) USING utf8)) AGAINST ('Krakow');
于 2013-11-23T10:41:40.443 回答
1

根据评论中的讨论编辑:

由于您的表格方案看起来很好(就 utf8 而言)并且您在 OP 中给出的第一个代码示例是正确的(没有整理的那个),假设您有正确的数据库排序规则和连接本身 - 很可能您有克拉科夫的 advert_location 在超过 50% 的行中,这就是为什么你得到 0 行结果。

如果要使用全文搜索,则必须始终记住,如果表的全文索引包含出现在 50% 的数据行中的关键字,则匹配查询将忽略该关键字

因此,您可以在布尔模式下使用全文搜索来绕过 50% 的阈值。在此处查看文档MySQL Boolean Full-Text Searches

因此,例如,如果您的表中有 3 行,其中 Kraków、Krakow 和 Warszawa 作为 advert_location,则以下查询将为您提供 0 行结果:

SELECT advert_id 
FROM oop_adverts 
WHERE MATCH(`advert_location`) AGAINST ('Kraków')

但是如果你使用boolean mode,你会得到 2 行结果:

SELECT advert_id 
FROM oop_adverts 
WHERE MATCH(`advert_location`) AGAINST ('Kraków' IN BOOLEAN MODE)

如果您希望匹配多个单词,可以使用“+”运算符(有关详细信息,请参阅上面链接的文档)。

SELECT advert_id 
FROM oop_adverts 
WHERE MATCH(`advert_location`,`advert_title`) AGAINST ('+Kraków' '+Search phrase' IN BOOLEAN MODE)

需要注意的是,请记住已经使用包含“+”运算符来构造绑定参数,例如,如果您使用的是 PHP,您可以这样做:

$query= "SELECT advert_id 
        FROM oop_adverts 
        WHERE MATCH(`advert_location`,`advert_title`) AGAINST (:location :title IN BOOLEAN MODE)";

$SQL=$db->prepare($query);                          
$SQL->bindValue(':location', '+'.$searched_location, PDO::PARAM_STR);
$SQL->bindValue(':title', '+'.$searched_title, PDO::PARAM_STR);
于 2013-11-23T11:37:10.227 回答