mysql匹配不返回不区分大小写的结果

mysql匹配不返回不区分大小写的结果,mysql,join,case-insensitive,match-against,Mysql,Join,Case Insensitive,Match Against,我有两张桌子: 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',

我有两张桌子:

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 ;
Bucket只是一个持有者,而test1包含了所有进入Bucket的内容。例如:

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”的所有bucket)

到目前为止,我得到的是这个查询,它不会返回混合案例结果,因为在“Family”中找不到,而在“Family”中找到


我还应该补充的是,所有文本字段都有utf8\u general\u ci的排序规则,整个表都是MyISAM。

我认为您的表不使用
utf8\u general\u ci
作为排序规则,而是
utf8\u 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';

答案显然是在两个匹配条款周围添加了一些参数

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) )

您提供的示例在bucket描述和test描述中的所有小写字母中都有“family”。你能举一个更好的例子来说明你的问题吗?仅供参考,test1的insert语句中的字段名不正确(应该是
test1\u name
test1\u desc
)。另外,您的选择具有bucket.isvisible>0,这不包括在示例表中。但是,一旦我解决了这两个问题,查询将返回两行,因此很遗憾,我不知道实际问题的原因。(当然,除非整个大写字母都是一条红鲱鱼,而真正的问题是simpsons行上的bucket.isvisible参数!)您也可以这样简化查询:SELECT*FROM bucket RIGHT JOIN test1 on test1.bucket_id=bucket.id WHERE MATCH(bucket.bkt_关键字,bucket.bkt_desc,bucket.bkt_name,test1.test1_desc,test1.test1_name)与('family'在布尔模式下)可能您的列有一个二进制排序规则,即使您的表没有。请使用“SHOW FULL COLUMNS FROM tablename”(来自用户芬威)再次检查使用phpMyAdmin,所有字段和表格都将排序规则显示为utf8\u general\u ci。如果我导出表格,则排序规则将设置为utf8\u general\u ci.OMG!是的,这是因为运算符优先级()…没有排序规则,您的条件相当于
其中(isvisible>0和MATCH(…)或(MATCH(…)
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) )