Java连接MySQL中文乱码的根本原因是编码链路中至少一个环节未统一为UTF-8,需从MySQL服务端、数据库/表/字段、JDBC连接字符串、Java源文件编码、IDE设置及Web请求响应等多层逐一对齐为utf8mb4或UTF-8。

Java 连接 MySQL 时出现中文乱码,根本原因是编码链路中至少一个环节未统一为 UTF-8。不是单点问题,而是从 Java 源文件、IDE 编码、JDBC 连接、MySQL 服务端、数据库/表/字段字符集,到 HTTP 响应等多层协同失效的结果。解决的关键是逐层确认并强制对齐。
确保 MySQL 服务端与数据库层级使用 UTF-8(或 utf8mb4)
仅改表或字段不够,必须让 MySQL 启动时就以 UTF-8 为默认字符集:
- 编辑 MySQL 配置文件(Linux 下 /etc/mysql/my.cnf,Windows 下 my.ini),在
[client]、[mysql]、[mysqld]三处都添加:
default-character-set = utf8mb4 character-set-server = utf8mb4
- 重启 MySQL 服务(如
sudo systemctl restart mysql) - 验证是否生效:
SHOW VARIABLES LIKE 'character_set%';,重点关注character_set_server、collation_server - 对已有数据库执行:
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 对已有表执行:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
配置 JDBC 连接字符串显式指定编码
连接 URL 中必须包含 useUnicode=true&characterEncoding=utf8mb4,否则驱动默认按平台编码(如 Windows 的 GBK)通信:
- 正确示例:
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai -
useUnicode=true启用 Unicode 支持,characterEncoding=utf8mb4指定传输编码 - 务必注意:参数间用
&(HTML 实体),不是&;否则 URL 解析失败 - 推荐加上
serverTimezone避免时区警告,不影响编码但属最佳实践
统一开发环境与源码编码设置
Java 源文件本身若保存为 GBK,而编译器按 UTF-8 解析,字符串字面量就会出错:
立即学习“Java免费学习笔记(深入)”;
- 在 IDE(如 IntelliJ IDEA 或 Eclipse)中设置项目编码为 UTF-8:
→ File → Settings → Editor → File Encodings → Global Encoding / Project Encoding / Default encoding for properties files → 全部选 UTF-8 - 检查
.java文件实际保存编码:用 Notepad++ 或 VS Code 查看右下角编码标识,非 UTF-8 则“转为 UTF-8 并保存” - 编译时可加 JVM 参数强制编码:
javac -encoding UTF-8 YourClass.java
Web 场景需额外处理请求与响应编码
Servlet/JSP 环境下,HTTP 层的编码不匹配会覆盖数据库层的努力:
- 在 Servlet 的
doPost开头立即调用:request.setCharacterEncoding("UTF-8");(必须在getParameter()之前) - 设置响应头:
response.setContentType("text/html;charset=UTF-8"); - JSP 页面顶部添加:
<%@ page contentType="text/html;charset=UTF-8" %> - HTML 中声明:
<meta charset="UTF-8">


















