您的位置:首页 > 编程语言 > Java开发

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

2016-01-04 22:20 435 查看
java与jsp对于mysql的操作大致是相同的,在此以jsp为例进行介绍。

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

在jsp页面的<%@ page 位置加上 contentType=”text/html; charset=utf-8″ %>,<meta 的位置也是如此:content=”text/html;charset=utf-8″ />

建立一个mysql数据库,字符集采用utf-8,建表也是如此。

在getConnection的URL中加上:?useUnicode=true&characterEncoding=UTF-8″,如:url = “jdbc:mysql://localhost:3306/(此处为数据库名称)?useUnicode=true&characterEncoding=UTF-8″,也就是在(数据库名称)的后面 其中问号不能丢

如果你不是在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: