2013-02-04 43 views
8

我有两个表:MySQL的对阵没有返回区分大小写的结果

CREATE TABLE IF NOT EXISTS `test1` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `bucket_id` int(10) unsigned NOT NULL COMMENT 'folder this component belongs to', 
    `test1_name` varchar(81) NOT NULL COMMENT 'Name of this component', 
    `test1_desc` varchar(1024) NOT NULL COMMENT 'Component Description', 
    PRIMARY KEY (`id`), 
    FULLTEXT KEY `test1_search` (`test1_name`,`test1_desc`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 

CREATE TABLE IF NOT EXISTS `bucket` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `bkt_name` varchar(81) NOT NULL COMMENT 'The name of this bucket', 
    `bkt_desc` varchar(1024) NOT NULL COMMENT 'A description of this bucket', 
    `bkt_keywords` varchar(512) DEFAULT NULL COMMENT 'keywords for searches', 
    PRIMARY KEY (`id`), 
    FULLTEXT KEY `fldr_search` (`bkt_desc`,`bkt_keywords`,`bkt_name`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ; 

桶仅仅是一个持有人在test1的包含所有将进入桶中的东西。例如:

INSERT INTO `bucket` (`id`, `bkt_name`, `bkt_desc`, `bkt_keywords`) VALUES 
(1, 'Simpsons', 'The Simpsons Cartoon Family was first successful adult cartoon series', 'Homer, Marge, Lisa and Bart'), 
(2, 'Griffins', 'The family from the popular family guy series', 'Peter, Lois, Meg, Chris, Stewie, Brian'); 

INSERT INTO `test1` (`id`, `bucket_id`, `bkt_name`, `bkt_desc`) VALUES 
(1, 1, 'Homer Simpson', 'Homer the figurative head of the Simpsons Family and is the husband of Marge'), 
(2, 2, 'Peter Griffin', 'Peter the figurative head of the Griffin family on the hit TV seriers The family Guy'); 

现在,使用下面的查询我想看看他的名字,描述或关键字包含搜索项目“家庭”或者其成分包含单词“家庭”)

所有桶到目前为止,我所拥有的就是这个查询,并且它没有返回混合大小写结果,因为在“family”中找不到“Family”。

SELECT * 
FROM bucket 
RIGHT JOIN test1 ON test1.bucket_id = bucket.id 
WHERE 
    bucket.isvisible > 0 AND 
    MATCH(bucket.bkt_keywords, bucket.bkt_desc, bucket.bkt_name) 
    AGAINST('family' IN BOOLEAN MODE) OR 
    MATCH(test1.test1_name, test1.test1_desc) 
    AGAINST('family' IN BOOLEAN MODE) 

我还应该补充说,所有文本字段都具有utf8_general_ci的排序规则,就像整个MyISAM表一样。

+0

提供的示例在存储桶描述和测试说明中都提供了全部小写的“family”。你能举一个更好的例子来证明你的问题吗? – scwagner

+1

仅供参考,test1的insert语句中的字段名称不正确(应该是'test1_name','test1_desc')。您的SELECT也有bucket.isvisible> 0,它不包含在示例表中。一旦我修复了这两件事情,查询就返回了两行,所以不幸的是我不知道实际问题的原因。 (当然,除非整个东西是红鲱鱼,真正的问题是辛普森行上的bucket.isvisible参数!) –

+0

也可以简化查询,如下所示:SELECT * FROM bucket RIGHT JOIN test1 ON test1 .bucket_id = bucket.id WHERE MATCH(bucket.bkt_keywords,bucket.bkt_desc,bucket.bkt_name,test1.test1_desc,test1.test1_name) 反对('家庭'BOOLEAN模式) –

回答

1

答案显然是增加一些parens围绕两个比赛对子句。

SELECT * 
FROM bucket 
RIGHT JOIN test1 ON test1.bucket_id = bucket.id 
WHERE bucket.isvisible > 0 AND 
(MATCH(bucket.bkt_keywords, bucket.bkt_desc, bucket.bkt_name) 
    AGAINST('family' IN BOOLEAN MODE) OR 
    MATCH(test1.test1_name, test1.test1_desc) 
    AGAINST('family' IN BOOLEAN MODE)) 
+0

OMG!是的,这是因为运算符优先级(http://dev.mysql.com/doc/refman/5.5/en/logical-operators.html)...没有parens,你的条件等同于WHERE(isvisible> 0和MATCH(...))或(MATCH(...))' – RandomSeed

2

我认为你的表不使用utf8_general_ci作为整理,但是utf8_bin。我能够重现修改表之后,你的行为描述如下:

ALTER TABLE test1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; 
ALTER TABLE bucket CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; 

你或许应该明确地设置你的表的排序规则:

ALTER TABLE test1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 
ALTER TABLE bucket CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

如果上述改变任何东西,我猜想您的服务器或会话实际上被设置为默认使用其他排序规则(因为排序规则未在您的表定义中指定)。这可以检查:

SHOW GLOBAL VARIABLES LIKE 'collation_server'; 
SHOW SESSION VARIABLES LIKE 'collation_server'; 
+0

使用phpMyAdmin的所有字段,并且这些表格将排序规则显示为utf8_general_ci。如果我导出表,COLLATE设置为utf8_general_ci。 – ppetree

+0

另外SHOW语句都返回utf8_unicode_ci – ppetree