查不到中文数据的根本原因是数据库、表、列、客户端四层字符集未统一,哪怕仅一层为latin1或mysql的utf8(非utf8mb4),就会导致中文存不进、查不出、显示为问号;同时排序规则(collation)不匹配也会使where等值查询失败。

查不到中文数据?先看四层字符集是否统一
根本原因不是SQL写错,而是数据库、表、列、客户端四层字符集没对齐。哪怕只有一层是latin1或utf8(MySQL里的3字节伪UTF-8),中文就存不进、查不出、显示成问号。
实操建议:
- 查列定义:
SHOW CREATE TABLE table_name,确认字段带CHARSET=utf8mb4和COLLATE=utf8mb4_unicode_ci - 建表时显式声明:
CREATE TABLE t (name VARCHAR(50) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci) - 连接时强制指定:
pymysql.connect(..., charset='utf8mb4')、mysql --default-character-set=utf8mb4、JDBC URL加?useUnicode=true&characterEncoding=utf8mb4 - 别用
utf8——MySQL里它不支持emoji和部分生僻汉字,必须用utf8mb4
WHERE name = '张三' 返回空?COLLATION才是关键
字符集对了,排序规则(Collation)不对照样匹配失败。比如utf8mb4_bin严格区分全角/半角、大小写,而utf8mb4_general_ci已弃用且对某些中文排序不准。
实操建议:
- 查当前字段排序规则:
SHOW FULL COLUMNS FROM table_name LIKE 'name',看Collation列 - 优先选
utf8mb4_unicode_ci(兼容性好)或utf8mb4_0900_as_cs(MySQL 8.0+,大小写敏感但中文稳定) - 临时修复匹配:
SELECT * FROM t WHERE name COLLATE utf8mb4_unicode_ci = '张三' - 永久修改:
ALTER TABLE t MODIFY name VARCHAR(50) COLLATE utf8mb4_unicode_ci
LIKE '%中文%' 总是慢?不是字符集问题,是索引失效
只要用了前导通配符%,B+树索引就完全失效,不管字段是不是utf8mb4,都会全表扫描。这不是多语言特有问题,而是B+树结构决定的。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
实操建议:
- 能用等值就不用
LIKE:WHERE name = '李四'走索引,WHERE name LIKE '李%'也能走(后缀通配可行) - 真要模糊搜全文,考虑
FULLTEXT索引或外部搜索引擎(Elasticsearch) - 避免在
WHERE里对字段做函数处理,如WHERE UPPER(name) LIKE '%张%',直接让索引失效
跨库/UNION报错Illegal mix of collations?排序规则必须一致
MySQL要求UNION、JOIN、ORDER BY等操作中涉及的字段排序规则完全一致。比如users.username用utf8mb4_unicode_ci,而information_schema.tables.table_name默认是utf8mb4_0900_as_cs,就会报错。
实操建议:
- 查两边字段的
Collation:SHOW FULL COLUMNS FROM users LIKE 'username'和SHOW FULL COLUMNS FROM information_schema.tables LIKE 'table_name' - 临时对齐:
SELECT username FROM users WHERE id = 1 UNION SELECT table_name COLLATE utf8mb4_unicode_ci FROM information_schema.tables - 长期方案:建表时统一用同一套
COLLATE,避免混用_ci、_cs、_bin变体
真正容易被忽略的是:字符集设置是“链式依赖”,客户端编码错一点,后面所有环节都白搭;而排序规则影响的是“语义比较”,连=这种基础操作都可能悄无声息地失效。










