改了ft_min_word_len仍搜不到短词,是因为xampp未加载配置、innodb需设innodb_ft_min_token_size、或未重建全文索引;中文推荐用ngram解析器替代调小词长。

为什么改了ft_min_word_len还是搜不到短词?
因为 XAMPP 启动 MySQL 时根本没读你改的配置。常见操作是直接在命令行跑 mysqld ft_min_word_len=2,但这只是临时启动一个独立进程,和 XAMPP 控制面板里启的服务完全无关;它不写入数据目录、不加载配置文件、也不持久化任何设置。你用 PHPMyAdmin 查到的值仍是默认 4,不是“没生效”,而是压根没走那条路。
XAMPP 的 my.cnf 文件到底该放哪?
Windows 下 XAMPP 默认不自带 my.cnf,必须手动创建并放在正确路径,否则 MySQL 启动时会静默忽略你的配置。实操步骤如下:
- 打开
XAMPP\mysql\bin\目录(不是XAMPP\mysql\conf\) - 新建文本文件,命名为
my.cnf(注意无后缀) - 内容必须严格包含
[mysqld]段落,例如:[mysqld] ft_min_word_len = 2
- 保存后,**彻底关闭 XAMPP 控制面板里的 MySQL 服务(不是“停止”,是点“退出”或任务管理器杀掉所有 mysqld.exe 进程)**
- 再从控制面板重新启动 MySQL
验证是否生效:SHOW VARIABLES LIKE 'ft_min_word_len'; —— 这次应该返回 2。
InnoDB 表要改 innodb_ft_min_token_size,不是 ft_min_word_len
如果你的表引擎是 InnoDB(XAMPP 8.0+ 默认),ft_min_word_len 对它完全无效。必须用 innodb_ft_min_token_size,且它只在建索引时读取一次,运行时不可改。操作链不能断:
- 停 MySQL(同上,确保进程全退)
- 修改
my.cnf,加一行:innodb_ft_min_token_size = 2 - 重启 MySQL
- 删旧全文索引:
ALTER TABLE t DROP INDEX ft_idx; - 重建索引:
ALTER TABLE t ADD FULLTEXT INDEX ft_idx (col);
漏掉重建这步,哪怕参数改对了,老索引里还是按默认 ≥3 的规则存的倒排表,搜短词依然为空。
中文搜索别硬刚 ft_min_word_len,优先用 ngram 解析器
把 ft_min_word_len 改成 1 或 2 来搜中文,效果差且副作用大:索引体积暴增、停用词过滤失效、大量无意义单字被索引。MySQL 5.7.6+ 原生支持 ngram,更适合中文分词:
- 在
my.cnf中加:ngram_token_size = 2(二元分词,覆盖大部分双字词) - 建索引时显式指定解析器:
ADD FULLTEXT INDEX ft_idx (title) WITH PARSER ngram - 查询时仍用
AGAINST('云' IN BOOLEAN MODE),但底层已按字符切分,无需调小词长
注意:ngram 启用后,innodb_ft_min_token_size 和 ft_min_word_len 就不再参与中文分词逻辑 —— 这个细节很多人在重建索引后仍搜不到,就是因为没意识到两者互斥。
最常被跳过的动作是:改完配置不杀干净 mysqld 进程,或删了索引忘了重建,或以为参数生效就等于数据已重索引。全文索引的配置、重建、查询模式三者必须严格对齐,缺一不可。











