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

标签 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',
  `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 包含所有可以放入桶中的东西。例如:

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 表一样。

最佳答案

我认为您的表不使用 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;

如果以上改变了什么,我猜你的服务器或 session 实际上设置为默认使用另一个排序规则(因为排序规则没有在你的表定义中指定)。这可以通过以下方式检查:

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

关于mysql匹配不返回不区分大小写的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14694620/

相关文章:

php - 添加多个sql查询的结果

mysql - 让 MySQL 使用索引/键,其中 1 列和 2 按顺序排列

MySQL 查询 : Match comma separated value with column containing comma separted string

php - 如何从另一个具有相同 id 的多条记录的表中获取记录?

正则表达式 - 如何让我的表达式不区分大小写?

Python 不区分大小写替换所有多个字符串

PHP : How to remove images in the directory of my website using PHP

java - 无法解决属性(property)问题

mysql - sqlzoo 上的自连接教程 #10

java - 使用 switch 语句时如何忽略大小写