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)通信:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 正确示例:
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai -
useUnicode=true启用 Unicode 支持,characterEncoding=utf8mb4指定传输编码 - 务必注意:参数间用
&(HTML 实体),不是&;否则 URL 解析失败 - 推荐加上
serverTimezone避免时区警告,不影响编码但属最佳实践
统一开发环境与源码编码设置
Java 源文件本身若保存为 GBK,而编译器按 UTF-8 解析,字符串字面量就会出错:
- 在 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 页面顶部添加:
- HTML 中声明:
<meta charset="UTF-8">
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










