JavaEE+Mysql中文乱码
如果说在Java Web开发的世界里有什么问题是每一位开发者都绕不过去的,那中文乱码问题绝对名列前茅。对于刚刚踏入Java EE世界的初学者来说,中文乱码就像是一道无形的墙——你明明知道数据是正确的,但显示出来的却是一堆让人哭笑不得的乱码字符。今天,我想把自己在解决中文乱码问题上摸索出来的经验,系统地整理出来,帮助更多正在被这个问题困扰的朋友。

事情的起因要从一个项目说起。那时候我正在做一个简单的学生信息管理系统,用JSP做前端页面,用Servlet做后台处理,用MySQL做数据存储。功能实现得很顺利,添加、删除、修改、查询,一切逻辑都跑通了。我满心欢喜地准备给同学们展示一下我的”杰作”。结果,当我输入”张三”这个名字并保存到数据库之后,页面上显示出来的却是”???”。那一刻,我的心情就像是从山顶一下子跌到了谷底。
这不是个例。在接下来的几天里,我遇到了各种各样的乱码问题:表单提交过来的中文变成了乱码、从数据库读取出来的中文变成了问号、URL参数里的中文被编码成了 %E5%BC%A0%E4%B8%89、甚至有时候同一个页面上,一部分中文显示正常,另一部分却是乱码。这些问题像一群打不死的小强,按下一个又冒出来一个,让人头疼不已。
我开始在网上搜索解决方案。结果发现,关于中文乱码的帖子铺天盖地,但每个帖子的答案都不完全一样。有人说改数据库配置,有人说改代码里的编码设置,有人说改服务器配置,还有人说改操作系统的语言环境。更让人崩溃的是,这些方法单独用都不一定管用,必须组合起来才行。

在经历了无数次失败和重试之后,我终于总结出了一套完整的解决方案。这套方案涵盖了从数据请求到数据存储再到数据展示的整个链路,一共分为五个关键步骤。下面我逐一详细说明。
第一步:数据库连接字符串
在数据库的JDBC连接URL中,必须显式地指定字符编码。这是很多初学者最容易忽略的一步。正确的写法如下:
1 | jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8 |
这里有两个关键参数:useUnicode=true 告诉驱动使用Unicode字符集,characterEncoding=UTF-8 指定具体的编码方式。如果只写 useUnicode=true 而不指定 characterEncoding,驱动会使用默认的编码(通常是ISO-8859-1),这样中文就会出问题。
需要注意的是,URL中的 & 符号在XML配置文件中要写成 &,否则会导致XML解析错误。这也是一个很容易踩的坑。

第二步:数据库表和字段的字符集
仅仅在连接字符串中指定编码是不够的。数据库本身的表和字段也必须设置为UTF-8编码。具体来说:
- 创建数据库时:
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; - 创建表时:
CREATE TABLE users (...) DEFAULT CHARSET=utf8; - 如果需要修改已有表的编码:
ALTER TABLE users CONVERT TO CHARACTER SET utf8;
更根本的解决方案是直接修改MySQL的配置文件。找到MySQL安装目录下的 bin 目录中的 my.ini(Windows系统)或 /etc/my.cnf(Linux系统),在 [mysqld] 和 [client] 段落下分别添加:
1 | [mysqld] |
修改完之后,必须重启MySQL服务,并且重新创建数据库和表,新的编码设置才会生效。这一步非常重要——如果你只是在配置文件里改了编码,但没有重新建库建表,旧的表依然使用旧的编码,问题依然存在。
第三步:Servlet中的编码设置
在Java代码中处理HTTP请求和响应时,必须正确地设置字符编码。具体来说:
在处理POST请求时,必须在调用 getParameter() 之前设置编码:
1 | request.setCharacterEncoding("UTF-8"); |
这里有一个很容易被忽略的细节:setCharacterEncoding 必须在 getParameter 之前调用。如果先调用了 getParameter,请求的参数已经被解析过了(使用默认编码),此时再设置编码就为时已晚了。
更推荐的做法是写一个Filter(过滤器),在请求到达Servlet之前统一处理编码问题:
1 | public class EncodingFilter implements Filter { |
使用Filter的好处是,你不需要在每个Servlet里重复写编码设置的代码,一次配置,全局生效。

第四步:JSP页面的编码声明
每一个JSP页面的头部,都必须加上正确的编码声明:
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> |
这里有两个容易混淆的属性:
contentType中的charset=UTF-8告诉浏览器用什么编码来解析页面内容pageEncoding告诉JSP引擎用什么编码来编译这个JSP文件
两者都必须设置为UTF-8,缺一不可。如果你用的是HTML文件而不是JSP文件,也需要在 <head> 标签中添加:
1 | <meta charset="UTF-8"> |
第五步:Tomcat服务器的编码配置
最后一步,也是很多人遗漏的一步——配置Tomcat服务器的URI编码。
在Tomcat的 conf/server.xml 文件中,找到 <Connector> 标签,添加 URIEncoding="UTF-8" 属性:
1 | <Connector connectionTimeout="20000" port="8080" |
这一步的作用是确保通过URL传递的中文参数(GET请求)能够被正确地解码。如果不设置这个属性,Tomcat默认使用ISO-8859-1编码来解码URL参数,中文就会变成乱码。

写在最后
以上五个步骤,每一步都是中文乱码问题链路上的一个关键环节。只有五个步骤都做到位了,中文乱码问题才能彻底解决。漏掉任何一步,都可能在某个环节出现乱码。
当然,编码问题远不止这些。在实际开发中,你可能还会遇到HTTP Header中的中文乱码、文件上传时的中文文件名乱码、JSON数据传输时的编码问题等等。但好消息是,只要你掌握了上面这套完整的编码配置方案,大部分的中文乱码问题都可以迎刃而解。
编程之路就是这样,充满了各种看似琐碎却又不得不解决的细节问题。每一个踩过坑的开发者,都是从无数个”为什么显示的是乱码”的夜晚走过来的。希望这篇总结能够帮助正在被乱码困扰的你,少熬几个夜,多喝几杯咖啡以外的快乐。
编码问题虽然烦人,但每解决一次,你对整个Web请求处理流程的理解就会更深一层。从这个角度来说,乱码也不是那么讨厌了,对吧?





