在使用JDBC开发的过程中,通常会遇到中文保存到数据库乱码的问题。
这个问题的产生有3个方面:
数据库,包括数据库编码、表编码、字段编码等
在Java Web 程序中,请求对象(Request)未进行编码处理
JDBC连接数据的URL未加字符编码参数
下面们从3个方向演示一些解决方法。
MySQL数据库编码
在创建数据库时,在创建表时,在创建字段时,留意下编码是不是UTF-8。
如下面的创建数据库脚本将字符编码设置为UTF-8
CREATE DATABASE `northwind` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin*/;
下面的建表脚本将表字符编码和字段字符编码设置为UTF-8
CREATE TABLE `bigtb` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) COLLATE utf8_bin DEFAULT NULL,
`file` mediumtext COLLATE utf8_bin DEFAULT NULL,
`images` longblob DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
在使用MySQL Workbench工具创建数据库、表、字段时可以下拉选择字符编码,非常方便。
请求对象编码
在Java Web 程序中,可以拦截请求对象(Request),设置UTF-8编码。
只在写一个过滤器Filter,所有请求编码都生效。
importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.annotation.WebFilter;importjavax.servlet.annotation.WebInitParam;/*** Servlet Filter implementation class CharsetEncodingFilter*/@WebFilter(urlPatterns= {"/*"}, initParams ={
@WebInitParam(name= "encoding", value = "UTF-8")})public class CharsetEncodingFilter implementsFilter {privateFilterConfig config;publicCharsetEncodingFilter() {
}
@Overridepublic voiddestroy() {//TODO Auto-generated method stub
}
@Overridepublic voiddoFilter(ServletRequest request, ServletResponse response,
FilterChain chain)throwsIOException, ServletException {
request.setCharacterEncoding(config.getInitParameter("encoding"));
chain.doFilter(request, response);
}
@Overridepublic void init(FilterConfig fConfig) throwsServletException {this.config =fConfig;
}
}
JDBC URL参数编码
只要在连接URL字符里添加参数 ?useUnicode=true&characterEncoding=utf-8
完整的URL字符串如下:
String url = "jdbc:mysql://127.0.0.1:3306/northwind?useUnicode=true&characterEncoding=utf-8";