java/jsp-向mysql写数据时出现了中文乱码

java与jsp对于mysql的操作大致是相同的,在此以jsp为例进行介绍。   

JSP页面想mysql插入数据,但中文现出了:“???”这样的乱码,第一反应是直接在mysql 里执行插入中文语句,mysql成功了,没有出现乱码(对于直接插入也是乱码的情况最后也进行介绍)。于是上网找了很多资料: 其实无论是用什么编码:gb2312或者utf-8,都要遵循编码统一的道理。就是说如果你在页面中采用了utf-8,那么你建mysql表时也如此,以下是如处需要统一的地方:

  1. 在jsp页面的<%@ page 位置加上 contentType=”text/html; charset=utf-8″ %>,<meta 的位置也是如此:content=”text/html;charset=utf-8″ />
  2. 建立一个mysql数据库,字符集采用utf-8,建表也是如此。
  3. 在getConnection的URL中加上:?useUnicode=true&characterEncoding=UTF-8″,如:url = “jdbc:mysql://localhost:3306/(此处为数据库名称)?useUnicode=true&characterEncoding=UTF-8″,也就是在(数据库名称)的后面             其中问号不能丢



  4. 如果你不是在jsp页面里直接处理form,也是和我一样采用servlet来处理form的话,那么在还要增加一个过滤器,这主要是因为采用的是tomcat的web发布器,如果用resin的话,不会有这样的问题,这也是我后面花了很长时间的原因所在。
    过虑器 SetCharacterEncodingFilter.java  的代码:
    package peom;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.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;

     

    public class SetCharacterEncodingFilter implements Filter {
        class Request extends HttpServletRequestWrapper
        {
            public Request(HttpServletRequest request) {
                super(request);
            }

            public String toChi(String input) {
                try {
                    byte[] bytes = input.getBytes(”ISO8859-1″);
                    return new String(bytes, “utf-8″);
                } catch (Exception ex) {
                }
                return null;
            }

            private HttpServletRequest getHttpServletRequest()
            {
                return (HttpServletRequest) super.getRequest();
            }

            public String getParameter(String name)
            {
                return
                toChi(getHttpServletRequest().getParameter(name));
            }
            public String[] getParameterValues(String name)
            {
                String values[] =getHttpServletRequest().getParameterValues(name);
                if (values != null) {
                    for (int i = 0; i < values.length; i++) {
                        values[i] = toChi(values[i]);
                    }
                }
                return values;
            }
        }

        public void destroy() {
        }
        public void doFilter(ServletRequest request, ServletResponse
        response,FilterChain chain) throws IOException, ServletException {
            HttpServletRequest httpreq = (HttpServletRequest) request;

            if (httpreq.getMethod().equals(”POST”)) {

                request.setCharacterEncoding(”utf-8″);

            } else {
                request = new Request(httpreq);
            }

            chain.doFilter(request, response);
        }

        public void init(FilterConfig filterConfig) throws
        ServletException {
        }  
    }

    然后在WEB-INF目录下的web.xml文件,配置下过虑器,

    <filter>
       <filter-name>SetCharacterEncodingFilter</filter-name>
       <filter-class>peom.SetCharacterEncodingFilter</filter-class>
     </filter>
     <filter-mapping>
       <filter-name>SetCharacterEncodingFilter</filter-name>
       <url-pattern>/*</url-pattern>
     </filter-mapping>

    这里要注意的是:路径、代码尽量放在前面,最好是<web-app 的后面

 对于直接想mysql插入也是乱码的情况进行介绍
  1.我用的SQLyog进行的mysql管理,在建立数据库时,直接进行设置
 
2.在建立表时sql语句进行设置
如下面见表的sql语句 其中DEFAULT CHARSET=gbk,指定类型。
CREATE TABLE `tb_waterflower` (
  `id` int(100) NOT NULL AUTO_INCREMENT,
  `usernumber` int(30) DEFAULT NULL,
  `famenid` int(30) DEFAULT NULL,
  `flowerid` int(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk

你可能感兴趣的:(java,jsp,mysql,中文乱码)