一般來說,中小型的Java EE程序,都是會把Mysql作爲首要的數據庫選擇,很大一個原因是Mysql開源、免費。要解決Mysql數據庫中文亂碼,就要統一Java EE程序和Mysql數據的編碼字符。一般來說,中文的編碼字符會選擇GBK或者UTF8,UTF8佔用的存儲空間會比較大,但是UTF8能支持各國的文字編碼(可以說是萬國碼)。下面我選用UTF8編碼。
將Java EE程序的編碼統一設爲UTF8
這裏將使用Filter來將請求和響應的編碼設置爲UTF8,一個CharacterEncodingFilter,一般來說,如果你的web.xml配置文件有若干個Filter要配置,那麼優選字符集編碼設置的Filter放在前面。
public class CharacterEncodingFilter implements Filter {
private String characterSet = "UTF-8"; //默認的字符編碼集是UTF-8
public String getCharacterSet() {
return characterSet;
}
public void setCharacterSet(String characterSet) {
this.characterSet = characterSet;
}
/* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) arg0;
request.setCharacterEncoding(characterSet);
HttpServletResponse response = (HttpServletResponse) arg1;
response.setCharacterEncoding(characterSet);
arg2.doFilter(request, response);
}
/* (non-Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
String characterSet = arg0.getInitParameter("characterSet");
try{
Charset.forName(characterSet);//如果是一個不存在的字符集,將拋出異常
this.characterSet = characterSet;
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
web.xml文件配置
<!-- 字符編碼Filter -->
<!-- BEGIN -->
<filter>
<description>統一字符編碼的Filter</description>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.daniel.filter.impl.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>characterSet</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- END -->
這裏還需要注意,在JSP或者HTML頁面上,通過表單傳遞的參數,必須是指定使用method="post",否則在頁面之間傳遞中文,也是會亂碼的。
統一Mysql編碼
有時候,你即使設置了表的字符編碼是UTF8,但是,你通過Java EE傳遞過去的中文存儲到數據庫中仍然是錯誤的!很多人都會費解,其實不然,這個表的字符編碼式沒有錯,錯就錯在了你傳遞過來的中文第一時間是經過一個mysqld的守護線程來處理的,默認情況下,這個守護線程的字符編碼集是latin1(一個西歐字符編碼集),中文被當做西歐來進行處理,再存到數據庫,當然是錯誤的。要解決上述問題,需要配置my.ini這個Mysql啓動時的配置文件。
[client]
port=3306
[mysql]
default-character-set=utf8
這裏client,主要是通過控制檯這些傳遞中文,把它默認的字符編碼集設置爲UTF8,繼續往下找,設置mysqld
[mysqld]
default-character-set=utf8
把守護線程的默認編碼集,也更改成爲UTF8
總結
通過同一個Java EE程序和Mysql的編碼集,那麼就不會出現中文亂碼的情況。