Mysql中文乱码解决方案

本文介绍如何在JavaEE应用中统一设置UTF8编码,以解决中文乱码问题,并详细阐述如何配置MySQL数据库使用UTF8编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般来说,中小型的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的编码集,那么就不会出现中文乱码的情况。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值