最常见原因是字符集不支持中文或连接未声明正确编码;需确保数据库、表、列、客户端四层均统一为utf8mb4,排序规则用utf8mb4_unicode_ci,并避免LIKE前导通配符导致索引失效。

WHERE条件中用LIKE匹配中文时查不到结果
最常见原因是数据库、表、列的字符集不支持中文,或者客户端连接未声明正确编码。MySQL默认latin1根本存不了中文,即使存进去了也是乱码或问号,自然查不到。
实操建议:
- 先确认列字符集:
SHOW CREATE TABLE table_name;,重点看字段定义里有没有CHARSET=utf8mb4(推荐)或gbk - 确保建表时指定:
CREATE TABLE t (name VARCHAR(50) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci); - 连接时强制指定编码:MySQL命令行加
--default-character-set=utf8mb4;Python的pymysql.connect()要传charset='utf8mb4' - 避免用
utf8(MySQL里的别名,实际只支持3字节UTF-8),必须用utf8mb4
SELECT中中文显示为问号或方块
这是客户端解码失败的典型表现,和存储层无关,纯粹是“看到的”环节断了链。比如终端、IDE、JDBC URL没配对。
实操建议:
- MySQL命令行执行
SET NAMES utf8mb4;再查(临时生效) - Navicat等工具在连接属性里勾选「使用MySQL字符集」并设为
utf8mb4 - JDBC URL补全参数:
?useUnicode=true&characterEncoding=utf8mb4 - PHP的
mysqli_set_charset($conn, 'utf8mb4')不能省
WHERE name = '张三' 仍返回空——COLLATION影响相等判断
即使字符集正确,排序规则(COLLATION)不同也会导致比较失败。例如utf8mb4_bin区分大小写和全角/半角,而utf8mb4_general_ci已弃用且对某些中文处理不准。
实操建议:
- 优先用
utf8mb4_unicode_ci或utf8mb4_0900_as_cs(MySQL 8.0+,大小写敏感但中文友好) - 检查当前列排序规则:
SHOW FULL COLUMNS FROM table_name LIKE 'name';,看Collation列 - 修改排序规则:
ALTER TABLE t MODIFY name VARCHAR(50) COLLATE utf8mb4_unicode_ci; - 查询时临时指定:
SELECT * FROM t WHERE name COLLATE utf8mb4_unicode_ci = '张三';
LIKE '%中文%' 慢?索引失效的真正原因
不是中文本身慢,而是LIKE '%…%'前导通配符让B+树索引完全失效。哪怕字段是utf8mb4且有索引,照样全表扫描。
实操建议:
- 能用等值就不用LIKE:
WHERE name = '李四'走索引,WHERE name LIKE '李%'也走索引(前缀匹配) - 全文索引替代模糊查:
ALTER TABLE t ADD FULLTEXT(name);,然后用MATCH(name) AGAINST('中文' IN NATURAL LANGUAGE MODE) - 如果必须前后模糊,考虑Elasticsearch或Redisearch,数据库不是干这个的
- 确认索引是否被选中:
EXPLAIN SELECT * FROM t WHERE name LIKE '%王%';,看key列是否为NULL
字符集和排序规则必须从建库、建表、连库、查数据四个环节全部对齐,漏一环就可能“明明存了却查不到”。很多人卡在连接层或客户端显示层,反复改表结构反而白忙。

















