JDBC连接MySQL时指定编码需在URL中加useUnicode=true&characterEncoding=UTF-8,且须确保MySQL服务端、数据库、表、客户端四者均使用utf8mb4;MySQL 8.0+还须配置serverTimezone和allowPublicKeyRetrieval。

Java 中通过 JDBC 连接 MySQL 时指定编码,核心是在连接 URL 中添加字符集参数,同时确保 MySQL 服务端、数据库、表、客户端(JDBC)四者编码一致,否则仍可能出现乱码。
在 JDBC URL 中显式指定字符集
推荐方式是直接在连接字符串中加入 useUnicode=true&characterEncoding=UTF-8 参数:
- MySQL 5.7+ 和 MySQL 8.0 均支持该写法
- URL 示例:jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
-
注意:& 是 XML/HTML 实体写法,在 Java 字符串中直接写 & 即可(如
"?useUnicode=true&characterEncoding=UTF-8"),但若配置在 XML 文件(如 Spring 配置)中需用 &
配合 MySQL 服务端配置(关键但常被忽略)
JDBC 参数只是客户端声明,若 MySQL 本身未按 UTF-8 初始化,仍可能无效:
- 检查 MySQL 配置文件(my.cnf 或 my.ini)中是否包含:
-
[client]default-character-set = utf8mb4[mysqld]character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci - 重启 MySQL 服务生效
- 建库建表时也应显式指定:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
验证连接实际使用的编码
连接建立后,可通过 SQL 查询确认当前会话编码是否生效:
立即学习“Java免费学习笔记(深入)”;
- 执行
SHOW VARIABLES LIKE 'character_set%';—— 关注character_set_client、character_set_connection、character_set_results是否均为utf8mb4 - 执行
SHOW VARIABLES LIKE 'collation%';—— 确认排序规则匹配 - 若发现仍是
latin1,说明 URL 参数未生效或服务端配置未覆盖
MySQL 8.0+ 的额外注意事项
MySQL 8.0 默认使用 caching_sha2_password 认证插件,且对字符集更严格:
- 建议在 URL 中追加:
&serverTimezone=UTC(或对应时区)和&allowPublicKeyRetrieval=true(如需) - 若仍报错,可临时将用户认证方式改为
mysql_native_password:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; - 优先使用
utf8mb4而非utf8(MySQL 的utf8实际是阉割版,最多存 3 字节,不支持 emoji)


















