MySQL 在 MyISAM 中匹配 0 结果但在 InnoDB 上有效

MySQL match against 0 result in MyISAM but works on InnoDB

我有这个table

CREATE TABLE `tbl` (
  `id` bigint(20) NOT NULL,
  `code` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `tbl` ADD PRIMARY KEY (`id`);
ALTER TABLE `tbl` ADD FULLTEXT KEY `code` (`code`);

INSERT INTO `tbl` (`id`, `code`) VALUES (1, '110.103');

这是我的查询

SELECT code FROM `tbl` WHERE (MATCH (code) AGAINST ('110.103*' IN BOOLEAN MODE) ) 

但是没有结果。 有什么想法吗?

尝试:'"110.103"*' 否则它会忽略 "period".

MySQL 不允许 整数或双精度值。对于全文搜索

首先,全文索引存储单词。单词是分开的,例如按句点 - 实际上是任何不是字母、数字、下划线或单个撇号的东西。所以你的文本目前由两个词组成,“101”和“103”。

MySQL 全文索引将只存储 a minimum word length. MyISAM uses 4 as the default value for ft_min_word_len, so your 3-digit "words" are not included, while InnodB uses 3 for innodb_ft_min_token_size 的单词,这就是它们被包含的原因。更改这些设置(并重建索引),两个引擎都会找到相同的行。

话虽这么说:MATCH (code) AGAINST ('110.103*' IN BOOLEAN MODE) 仍会搜索字词。它将找到包含 "word" 110 或(!)以 103 开头的单词的任何行。您可以强制让两个词都带有 ('+110 +103*' IN BOOLEAN MODE),但它们的顺序可以是任意的。如果您使用 against('"110 103"'),您可以强制执行特定命令,但 " 不再支持 *

一个常见的技巧是用下划线 110_103 存储您的数字(并以这种方式搜索),然后这是一个完整的单词。你可以例如为此,请添加一个 code_search 列,您使用触发器(或将其定义为生成的列)保持最新,然后在该列中搜索。如果你的代码也可以包含 _,它不再区分 _.,所以你必须添加一个额外的条件(... where match (code_search) against (...) and code like '...')或类似的东西) .

但我不确定您是否真的需要在这里进行全文搜索。如果您的列实际上只包含一个代码(而不是包含几个单独单词的文本,这是全文索引的用例),您可能想尝试 where code like '101.103%'where code like '%101.103%'where code like '101.103%' or code like '% 101.103%' 具体取决于您要查找的内容。为此添加 code 的(正常)索引,至少第一次搜索会比全文搜索更快(除了与全文搜索相比,它会给你所需的结果).

虽然我怀疑这里的情况是否如此:如果您实际上正在寻找浮点数,如果您可以将它们作为实际数字存储在单独的列(或单独的 table 如果数据每行包含一个以上的浮点数)。