MySQL默认FULLTEXT对中文无效,因其按空格/标点切词,而中文无分隔符;需启用ngram解析器、设置ngram_token_size、建索引时显式指定WITH PARSER ngram,并用BOOLEAN MODE查询。

直接用 LIKE '%关键词%' 在博客文章内容字段上做模糊搜索,数据量一过几万行就会明显变慢;全文索引才是正解,但必须配对启用 ngram 解析器 + 调整 ngram_token_size,否则中文查不到结果。
为什么默认 FULLTEXT 对中文无效?
MySQL 原生全文索引按空格/标点切词,而中文无分隔符。“人工智能”会被当做一个整体词存入索引,搜“智能”或“人工”都匹配不上。必须靠 ngram 滑动窗口分词,例如 ngram_token_size=2 时,“人工智能”会拆成 “人工”、“智能”、“能”(若设为1)或 “人工智能”(若设为4),只有拆开才能命中子串。
必须改 my.cnf 并重启 mysqld
仅建索引不生效——ngram 是服务端插件,需显式启用。漏掉这步,MATCH() AGAINST() 会静默退化为自然语言模式,中文照样查不到。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 编辑
/etc/my.cnf,在[mysqld]下加两行:ngram_token_size=2ft_min_word_len=1 -
systemctl restart mysqld(Linux)或对应 Windows 服务重启命令 - 验证是否生效:
SHOW VARIABLES LIKE 'ngram_token_size';,输出值应为2
建索引时必须显式指定 WITH PARSER ngram
即使配置已生效,建索引时不写 WITH PARSER ngram,MySQL 仍用默认分词器,中文字段等于白建索引。
- 新建表时:
FULLTEXT INDEX content_word (content) WITH PARSER ngram - 已有表加索引:
ALTER TABLE tbl_article_content ADD FULLTEXT INDEX content_word (content) WITH PARSER ngram - 如果表已有数据,建完建议执行:
REPAIR TABLE tbl_article_content,强制重建索引以覆盖旧数据
查询必须用 BOOLEAN MODE 才可靠
自然语言模式(默认)会过滤停用词、忽略单字、按相关性排序,但对中文支持极弱;布尔模式才真正触发 ngram 分词逻辑,且支持 +/- 控制词项。
- 正确写法:
SELECT article_id FROM tbl_article_content WHERE MATCH(content) AGAINST('+编程' IN BOOLEAN MODE) - 避免写法:
AGAINST('编程')(无模式声明 → 默认自然语言 → 很可能查不到) - 多词组合:
AGAINST('+前端 +框架 -培训' IN BOOLEAN MODE)
最容易被忽略的是:配置改了但没重启 mysqld,或者建索引漏了 WITH PARSER ngram,这两处任一出错,全文索引对中文就完全失效,而错误不会报出来,只会返回空结果——得逐条验证配置、索引定义、查询语法三者是否全部到位。

















