Mysql中文亂碼解決方案

一般來說,中小型的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的編碼集,那麼就不會出現中文亂碼的情況。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章