在使用JDBC开发的过程中,通常会遇到中文保存到数据库乱码的问题。
这个问题的产生有3个方面:
- 数据库,包括数据库编码、表编码、字段编码等
- 在Java Web 程序中,请求对象(Request)未进行编码处理
- JDBC连接数据的URL未加字符编码参数
下面们从3个方向演示一些解决方法。
MySQL数据库编码
在创建数据库时,在创建表时,在创建字段时,留意下编码是不是UTF-8。
如下面的创建数据库脚本将字符编码设置为UTF-8
1
|
CREATE
DATABASE
`northwind` /*!40100
DEFAULT
CHARACTER
SET
utf8
COLLATE
utf8_bin */;
|
下面的建表脚本将表字符编码和字段字符编码设置为UTF-8
1
2
3
4
5
6
7
|
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,所有请求编码都生效。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
import
java.io.IOException;
import
javax.servlet.Filter;
import
javax.servlet.FilterChain;
import
javax.servlet.FilterConfig;
import
javax.servlet.ServletException;
import
javax.servlet.ServletRequest;
import
javax.servlet.ServletResponse;
import
javax.servlet.annotation.WebFilter;
import
javax.servlet.annotation.WebInitParam;
/**
* Servlet Filter implementation class CharsetEncodingFilter
*/
@WebFilter
(urlPatterns = {
"/*"
}, initParams = {
@WebInitParam
(name =
"encoding"
, value =
"UTF-8"
)})
public
class
CharsetEncodingFilter
implements
Filter {
private
FilterConfig config;
public
CharsetEncodingFilter() {
}
@Override
public
void
destroy() {
// TODO Auto-generated method stub
}
@Override
public
void
doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws
IOException, ServletException {
request.setCharacterEncoding(config.getInitParameter(
"encoding"
));
chain.doFilter(request, response);
}
@Override
public
void
init(FilterConfig fConfig)
throws
ServletException {
this
.config = fConfig;
}
}
|
JDBC URL参数编码
只要在连接URL字符里添加参数 ?useUnicode=true&characterEncoding=utf-8
完整的URL字符串如下:
1
|
String url =
"jdbc:mysql://127.0.0.1:3306/northwind?useUnicode=true&characterEncoding=utf-8"
;
|