java数据库连接乱码的核心是连接层编码未对齐,需在jdbc url中设置useunicode=true&characterencoding=utf-8,并确保数据库、表、mysql服务配置及驱动版本(推荐8.0.x)均统一为utf8mb4。

Java 中数据库连接乱码,核心在于连接层编码未对齐:JDBC 驱动读写数据时,若不知道该用什么字符集解码/编码字节流,就会按默认(通常是 ISO-8859-1 或平台默认)处理,导致中文变问号或方块。
MySQL 连接字符串必须加编码参数
以 MySQL 为例,JDBC URL 中需显式声明字符集,缺一不可:
- useUnicode=true:启用 Unicode 支持(必要开关)
- characterEncoding=UTF-8(推荐)或 characterEncoding=GBK(仅限旧系统兼容)
完整示例:
jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai注意:& 是 XML/HTML 转义写法,实际代码中直接写 &;serverTimezone 非编码相关,但建议加上避免时区警告干扰排查。
数据库和服务端本身也要匹配
光改连接串不够,三个层面必须统一为 UTF-8:
-
数据库创建时:建库语句指定字符集,例如
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -
数据表与字段:建表时显式声明,如
title VARCHAR(100) CHARACTER SET utf8mb4 -
MySQL 服务配置(my.cnf):确保
[client]、[mysqld]、[mysql]段都设了default-character-set = utf8mb4和collation-server = utf8mb4_unicode_ci
JDBC 驱动版本与 utf8mb4 支持
MySQL 5.5.3+ 支持 utf8mb4(真正完整的 UTF-8,支持 emoji),但老驱动(如 mysql-connector-java 5.1.x)可能不完全兼容:
- 推荐使用 8.0.x 驱动(如
mysql-connector-j-8.3.0.jar) - 连接串中可补充
connectionCollation=utf8mb4_unicode_ci强制协商 - 避免只写
characterEncoding=utf8—— MySQL 的utf8实际是阉割版(最多 3 字节),不等于标准 UTF-8
验证是否生效的小技巧
连接成功后,执行 SQL 查询编码状态:
SHOW VARIABLES LIKE 'character_set%';SHOW VARIABLES LIKE 'collation%';
重点看 character_set_client、character_set_connection、character_set_results 是否全为 utf8mb4。如果不是,说明连接参数未生效或被服务端覆盖。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











