mysql 5.7+ 内置 ngram 解析器,无需安装插件;必须配置 ngram_token_size 并重启服务,建索引时显式声明 with parser ngram,且查询关键词长度不得小于 token_size,否则中文搜索必失败。

MySQL 安装后默认不支持中文搜索,不是因为“没装分词插件”,而是它压根没对中文做分词——默认用空格/标点切词,而中文没有空格。5.7+ 版本起,ngram 已内置,不用装、不能装,配错地方或漏写关键语法就会全程静默失效。
确认 ngram 是否真就绪,别被 SHOW PLUGINS 欺骗
执行 SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'ngram' 返回空是正常的,ngram 不注册为传统插件。真正该查的是系统变量:
-
SHOW VARIABLES LIKE 'ngram_token_size'—— 有返回且值为 1–10(默认 2),说明配置已加载 - 如果没结果,大概率是 my.cnf 没改对位置,或 MySQL 没重启
- Windows 下注意路径:通常是
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini;Linux 多为/etc/my.cnf或/etc/mysql/my.cnf
my.cnf 必须改对位置并重启,SET GLOBAL 无效
ngram_token_size 是只读全局变量,动态设置会报错或被忽略。必须编辑配置文件:
- 只在
[mysqld]段下添加:ngram_token_size = 2 - 不能写在
[client]或其他节里,否则完全不生效 - 值设为 0、负数或 >10,MySQL 启动可能失败;设为 1 虽能搜单字,但索引体积暴增、相关性崩坏
- 改完必须重启 MySQL 服务,热加载无效
建全文索引时漏掉 WITH PARSER ngram 就等于没建
哪怕字符集是 utf8mb4、引擎是 InnoDB、ngram_token_size 已配好,只要建索引语句里没写 WITH PARSER ngram,MySQL 就退回默认空格分词器,中文 MATCH 一定查不到结果:
- 正确:
CREATE FULLTEXT INDEX idx_title ON articles(title) WITH PARSER ngram - 错误:
CREATE FULLTEXT INDEX idx_title ON articles(title)(对中文完全无效) - 如果表已有旧索引,必须先
DROP INDEX再重建,不会自动升级 - 字段顺序要一致:建索引时是
(title, content),MATCH 中也得写MATCH(title, content)
查询时关键词长度不能低于 ngram_token_size
ngram 只支持自然语言模式(IN NATURAL LANGUAGE MODE)或布尔模式,不支持查询扩展。更重要的是:
- 设了
ngram_token_size = 2,搜“数”就匹配不到“数据库”,因为分词结果是“数据”“据库”,不含单字 - 想搜单字必须设为 1,但代价极高:索引膨胀、写入变慢、排序失真,生产环境慎用
- RDS 用户(如阿里云)不能直接改配置文件,得进控制台「参数设置」统一调
ngram_token_size、innodb_ft_min_token_size和ft_min_word_len
最容易被忽略的其实是三处硬性绑定:配置文件改对位置 + 重启服务 + 建索引显式写 WITH PARSER ngram。少一个,中文 MATCH 就永远返回空——而且没有任何报错提示。











