mysql中ft_min_word_len是只读变量,需在xampp的d:\xampp\mysql\bin\my.ini的[mysqld]段设置并重启、重建全文索引才生效,innodb中文场景还需配置ngram_token_size=2。

不能用 SET GLOBAL ft_min_word_len=1 临时修改 —— 这个变量在 MySQL 中是只读的,执行会报错 ERROR 1238 (HY000): Variable 'ft_min_word_len' is a read only variable。
找到 XAMPP 真正生效的 my.ini 配置文件
XAMPP 的 MySQL 配置不认系统目录(如 C:\Windows\my.ini)或随便新建的配置文件。它只加载自己安装路径下的 my.ini,且必须位于 D:\xampp\mysql\bin\ 或 D:\xampp\mysql\ 根目录(取决于版本)。常见误区:
- 在
C:\Windows\下改my.ini→ 完全无效 - 用记事本保存时编码不是 ANSI/UTF-8 无 BOM → 启动失败或参数被忽略
- 加了
ft_min_word_len=2但没放在[mysqld]段内 → 不生效
推荐做法:用 EditPlus / VS Code 打开 D:\xampp\mysql\bin\my.ini(若不存在,就新建一个),在 [mysqld] 区块末尾添加:
ft_min_word_len = 2 ft_max_word_len = 100
注意等号前后不要有空格,值必须是整数,且 ft_max_word_len 必须 ≥ ft_min_word_len。
重启 MySQL 前必须重建全文索引
改完配置、重启服务只是让新参数参与后续索引构建;已存在的全文索引仍按旧规则(比如 min=4)生成,不会自动刷新。不重建,搜索“的”“是”“我”这类两字词依然查不到。
重建操作分两步:
- 先删掉旧索引:
DROP INDEX idx_content ON articles; - 再建新索引:
CREATE FULLTEXT INDEX idx_content ON articles(content);
如果表用的是 InnoDB 引擎,且启用了 ngram 分词(推荐中文场景),还需额外加配置:ngram_token_size = 2(同样写在 [mysqld] 下),否则即使 ft_min_word_len=2,MySQL 仍按字符切分,对中文无效。
验证是否生效的三步检查法
别只信重启成功,要逐层确认:
- 查变量值:
SHOW VARIABLES LIKE 'ft_min_word_len';→ 输出应为设置的值(如 2) - 查索引字段实际分词效果:
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE WHERE MATCHED = '我';(需先查INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD确认“我”不在停用词表) - 实测搜索:
SELECT * FROM articles WHERE MATCH(content) AGAINST('测试' IN NATURAL LANGUAGE MODE);→ 若返回结果,说明两字词已可命中
最容易被跳过的点:InnoDB 全文索引依赖辅助表(INNODB_FT_INDEX_TABLE),而该表默认不实时更新;刚插入的数据可能要等几秒或执行 OPTIMIZE TABLE articles; 才进索引。别一查没结果就以为配置失败。











