您的位置:首页 > 数据库 > MySQL

写入mysql的中文乱码问题

2016-07-22 10:10 344 查看
提前说明我的问题,我一开始发现写入数据库的中文乱码,便连续进行了各种操作:

l  修改mysql的配置文件my.ini,设定了所有编码格式为utf-8,确认了表的字符集也为utf-8;

l  在每一次请求转发时都设置了请求与响应的编码为utf-8;

l  增加了过滤器类,拦截所有请求,也是设置请求与响应为utf-8;

l  而且考虑到了JSP页面与tomcat服务器的编码不统一问题,修改了相关配置文件;

 

但是乱码依然没有解决,此时我想到了最后一个问题:

因为我提取的是带文件的表单数据信息,这个与一般的post的普通表单不同(可以采用request.getParameter()获取参数值),必须使用item.getString()方法获得,而该方法有个重载方法为item.getString(“utf-8”),修改了此处,自己的问题终于得到解决。

 

相信使用数据库进行存储的大家都遇到过中文乱码问题,如何彻底解决?我百度了很多资料与博客,想把自己的经历总结起来给大家参考一下,接下来我先罗列一下大部分修改乱码问题的方法:

1.   修改mysql数据库的整体编码

引用自:http://www.cnblogs.com/24la/p/update-mysql-default-character.html

查看方式数据库编码:
1
show variables like 'character%';
 


该图是复制的(我的已经改好了)

出现上图情况时,可以进行数据库配置文件my.ini 文件修改:

打开my.ini找到[client]添加一行

default-character-set=utf8

 

 找到[mysqld]这行添加代码如下

character_set_server=utf8

init_connect='SET NAMES utf8'

要记住,一般该配置文件是拒绝访问的,更别提修改了,此时可以将该文件复制到桌面,修改为txt格式强行修改内容,然后改回ini文件格式并将之前的my.ini文件删除,然后将桌面上已经修改好的my.ini复制进去(这一系列操作都需要管理员权限才行)

 这样我们再查看下数据库的编码(我们必须关闭mysql服务和关闭mysql现有会话,保证我们以新的字符编码打开了)

 


但此时我的乱码问题依然没有解决,于是我将目光转向了eclipse。

2.   修改eclipse的页面编码

在eclipse中的window—preferences—General—workspace—页面左下角中的Text file encoding 设置为utf-8,这样只能保证新建文件和打开文件时不会出现乱码。

 

3.   修改jdbc连接属性编码

有一次乱码问题是通过在jdbc连接属性中的url=jdbc:mysql://localhost:3306/contact_sys的最后加入?useUnicode=true&characterEncoding=utf-8,就像是在Get请求在url下加入一下参数一样,这样就确保了java与mysql进行连接时的编码统一,很遗憾,还是没解决我的问题。

 

4.   修改JSP页面编码和tomcat服务器编码

引用自:http://blog.csdn.net/lhfeng/article/details/6311787

 

里面的一句话成功的吸引了我的注意:tomcat默认使用iso-8859-1进行提交的数据解码,而提交的数据是使用utf-8编码的,编解码对不上自然会出现乱码.解决办法就是指定解码方式。

于是我决定彻底解决问题:在tomcat/cof/server.xml配置文件中,修改其默认编码

找到如下代码:   

<Connector port="8080"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>

在其中加入如下代码:

useBodyEncodingForURI="true"URIEncoding="UTF-8"

 

其实该方法的作用很局限:当你已经设置了request.setCharacterEncoding("UTF-8");时,所有的post请求都会按照utf-8的编码来编解码,只有Get请求在处理时会按照tomcat的默认编码来解码,因此这项措施是针对获取get请求参数数据中文乱码的问题方法。

 

5.   增加过滤器类

为了彻底杜绝所有请求与响应数据的编码不一致问题,第一个想到的解决方案应该就是添加过滤器了。

 

public classSetEncodingFilter implements Filter {

public voiddoFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {

             

              request.setCharacterEncoding("UTF-8");

              response.setCharacterEncoding("UTF-8");

             

              chain.doFilter(request, response);

       }

}

我设置了拦截所有资源,即在项目的web.xml中进行如下配置:

<filter-mapping>

   <filter-name>SetEncodingFilter</filter-name>

    <url-pattern>/*</url-pattern>

  </filter-mapping>

满心欢喜的以为应该解决问题了,结果空欢喜一场。

 

6.   修改fileupload获取带文件的表单数据编码

引用:http://blog.csdn.net/jingyuwang1/article/details/21829605

这个兄弟给了一个想法:既然前前后后所有的问题都设置好了,会不会是这里出了问题?

 将 item.getString();改为item.getString('utf-8');

结果真的是这里的问题!终于解决了眼下的乱码问题。

 

 

7.   总结

mysql写入的中文乱码很有可能是jsp页面提取数据时乱码或者数据库编码与写入数据的编码不一致导致的,其他的地方一般不会出错,向上面一步步设置应该可以杜绝几乎所有的乱码问题了吧。
这次解决乱码问题让我觉得处理问题时对整个流程的理解和掌握特别重要,这样你就可以一步步的检查,修改,对照,一定会把问题给找出来,并且会学到很多深层的知识,对后期解决新的问题提供了经验。

当然了,出现问题多上百度查一下,从不同的角度搜索,也是很重要的,很多问题大家都遇到过了,耐心找一找就会得到答案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 数据库 乱码