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
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
相关文章推荐
- 如何手动安装eclipse插件
- (转载)java程序的几种类型
- java读取/写入属性文件
- Java 泛型具体解释
- Arrays.asList() 返回的list不能add,remove以及慎用java.util.Collections.copy()方法
- 设计模式学习笔记--装饰者模式(Decorator Pattern)
- Java中父类和子类关于构造方法和私有属性的几个问题
- Java正则表达式-语法与示例
- java socket学习笔记
- Java知识点汇总
- Java SE 第十讲---面向对象特征之封装2
- JAVA语法之小结
- Spring中 <tx:advice/> 标签
- 使用Spring为Hibernate配置声明式事物
- JAVA之经典Student类
- 通过eclipse配置Spring MVC项目
- Java学习之Iterator(迭代器)的一般用法 (转)
- java.util.ArrayList 源码
- JAVA多线程机制之暂停、恢复和停止
- java.lang.Long源码