核心是确保连接链路全程统一使用utf-8:1.jdbc连接字符串须同时设useunicode=true和characterencoding=utf8mb4;2.服务端配置character_set_server=utf8mb4;3.建库建表显式指定character set utf8mb4;4.java代码避免手动字符编码转换。

核心是确保“连接链路全程统一使用 UTF-8”,从 JDBC 连接参数开始,覆盖数据库服务端、表结构、字段定义三层设置。只改其中一环往往无效。
1. JDBC 连接字符串必须显式指定编码
这是最直接、最常被忽略的一步。不能依赖驱动自动推断:
- MySQL 示例:
jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai - PostgreSQL 示例:
jdbc:postgresql://localhost:5432/mydb?charset=utf8&stringtype=unspecified - Oracle 示例:
jdbc:oracle:thin:@//host:1521/orcl?useUnicode=true&characterEncoding=UTF-8
注意:useUnicode=true 和 characterEncoding=UTF-8 缺一不可;MySQL 8+ 推荐用 characterEncoding=utf8mb4 支持完整 emoji。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
2. 数据库服务端字符集要设为 UTF-8
仅改连接参数不够——如果服务端默认用 latin1 或 ISO-8859-1 处理客户端请求,照样乱码:
- MySQL:在
my.cnf的[mysqld]段添加character_set_server = utf8mb4collation_server = utf8mb4_unicode_ci
重启服务后执行SHOW VARIABLES LIKE 'character\_set\_%';确认全部为utf8mb4 - PostgreSQL:安装时应选择
en_US.UTF-8或中文 UTF-8 locale;运行中检查:SHOW server_encoding;→ 必须返回UTF8SHOW lc_messages;→ 建议设为zh_CN.UTF-8(避免错误信息乱码)
3. 数据库对象本身也要用 UTF-8
即使连接和服务端都对了,建库/建表时若没指定字符集,仍会继承服务端默认值(可能不是 UTF-8):
- 创建数据库时显式指定:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 创建表时指定,默认不写就可能沿用旧配置:
CREATE TABLE t1 (name VARCHAR(100)) CHARSET=utf8mb4; - 已有表可修改:
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4. Java 端代码层面别踩坑
连接没问题,但读写逻辑出错也会导致乱码:
- 插入前不要手动调用
new String(str.getBytes("GBK"), "UTF-8")类似转换——这是典型错误,会二次编码 - 读取 ResultSet 时,直接用
rs.getString("col")即可,JDBC 驱动已按连接参数完成解码 - Maven 项目务必在
pom.xml中声明源码编码:UTF-8
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










