數據庫的亂碼問題,一直都相當惱人,不過,要解決起來,其實也還是比較容易……
首先,需要設定數據庫的編碼,也就是要在數據庫連接字串里面設置好編碼:
url=jdbc:mysql://localhost:3306/databaseName?useUnicode=true&characterEncoding=UTF-8
在建立數據庫連接的時候,再指定用戶名和密碼就可以了。
隨后,需要在數據庫和數據表里都設定好編碼:
CREATE DATABASE `db` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `db`;
CREATE TABLE `user` (
? `id` int(11) NOT NULL auto_increment,
?? `username` char(20) default NULL COMMENT '用戶名',
?? `password` char(20) default NULL COMMENT '密碼',
? PRIMARY KEY? (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
最后是設定JSP文件的編碼,
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
或者是用個Filter:
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;
/**
?*?字符編碼過濾器
?*?
?*? @author ?xiaosilent.
?*?
? */
public ? class ?CharacterEncodingFilter? implements ?Filter?{
???? protected ?FilterConfig?filterConfig;
???? private ?String?targetEncoding? = ? " UTF-8 " ;
???? /**
?????*?初始化過濾器,獲取初始化參數,如果沒有設定則使用默認的UTF-8編碼.
????? */
???? public ? void ?init(FilterConfig?config)? throws ?ServletException?{
???????? this .filterConfig? = ?config;
???????? // ?如果在web.xml里定義了編碼,則獲取,否則使用默認的UTF-8.
???????? if ?(config.getInitParameter( " encoding " )? != ? null )?{
???????????? this .targetEncoding? = ?config.getInitParameter( " encoding " );
????????}
????}
???? public ? void ?doFilter(ServletRequest?request,?ServletResponse?response,
????????????FilterChain?chain)? throws ?IOException,?ServletException?{
????????request.setCharacterEncoding(targetEncoding);
????????response.setCharacterEncoding(targetEncoding);
????????chain.doFilter(request,?response);
????}
???? public ? void ?destroy()?{
????????filterConfig? = ? null ;
????}
}
在web.xml里加入:? <filter>import ?javax.servlet.Filter;
import ?javax.servlet.FilterChain;
import ?javax.servlet.FilterConfig;
import ?javax.servlet.ServletException;
import ?javax.servlet.ServletRequest;
import ?javax.servlet.ServletResponse;
/**
?*?字符編碼過濾器
?*?
?*? @author ?xiaosilent.
?*?
? */
public ? class ?CharacterEncodingFilter? implements ?Filter?{
???? protected ?FilterConfig?filterConfig;
???? private ?String?targetEncoding? = ? " UTF-8 " ;
???? /**
?????*?初始化過濾器,獲取初始化參數,如果沒有設定則使用默認的UTF-8編碼.
????? */
???? public ? void ?init(FilterConfig?config)? throws ?ServletException?{
???????? this .filterConfig? = ?config;
???????? // ?如果在web.xml里定義了編碼,則獲取,否則使用默認的UTF-8.
???????? if ?(config.getInitParameter( " encoding " )? != ? null )?{
???????????? this .targetEncoding? = ?config.getInitParameter( " encoding " );
????????}
????}
???? public ? void ?doFilter(ServletRequest?request,?ServletResponse?response,
????????????FilterChain?chain)? throws ?IOException,?ServletException?{
????????request.setCharacterEncoding(targetEncoding);
????????response.setCharacterEncoding(targetEncoding);
????????chain.doFilter(request,?response);
????}
???? public ? void ?destroy()?{
????????filterConfig? = ? null ;
????}
}
? ?? ?<filter-name>CharacterEncodingFilter</filter-name>
? ?? ?<filter-class>xiao.cms.filter.CharacterEncodingFilter</filter-class>
? </filter>
? <filter-mapping>
? ?? ?<filter-name>CharacterEncodingFilter</filter-name>
? ?? ?<url-pattern>/*</url-pattern>
? </filter-mapping>
這里使用的是UTF-8,所以沒有指定參數,如果用非UTF-8編碼,指定一個名為encoding的參數即可.
經過這樣三個步驟,就不存在亂碼問題了。
另,不推薦用 MySQL-Front 這個客戶端程序管理UTF-8編碼的數據庫。如果是GBK編碼還可以考慮,UTF-8則會出現編碼問題,導致程序不能正常工作,強烈推薦 Navicat 。 功能強大,默認使用UTF-8編碼,界面友好、美觀。