我的查询显示如下:
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);