MySQL UTF-8全文搜索,带有多个绑定参数


MySQL UTF-8 Full Text Search with multiple bound parameters

我的查询显示如下:

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。对不起我的"最好的英语"兄弟。

什么是表模式?

我想"location"被定义为一个二进制字符串,不能使用utf8_unicode_ci这样的排序规则进行比较。阅读此处了解更多信息。

http://dev.mysql.com/doc/refman/5.0/en/charset-binary-collations.html

编辑:

请告诉我们您的模式以获得进一步的帮助。然而,试试这样的东西:

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

根据评论中的讨论进行编辑:

由于您的表方案看起来很好(就utf8而言),并且您在OP中给出的第一个代码示例是正确的(没有collate的那个),假设您有正确的DB排序规则和连接本身——很可能您在超过50%的行中有用于advert_location的Kraków,这就是为什么您得到0行结果的原因。

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

因此,您可以在布尔模式下使用全文Serach来绕过50%的阈值。在这里查看文档MySQL布尔全文搜索

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

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

但是,如果您使用布尔模式,您将得到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);