2013-02-04 41 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