- 浏览: 13762 次
- 性别:
- 来自: 北京
文章分类
最新评论
问题的本质是:应用程序采用的字符集与数据库(mysql)采取的编码集不一致。产生问题的关键原因是,我们都是在基本功能做完后才去解决乱码问题,因此,按照网上大多数人介绍的方法,去修改数据库配置文件my.ini,通过指令直接去修改数据库或者表的字符集,都没有生效。后来,尝试在上述方法后新建一个表,发现问题解决,又查到,可以通过mysql> ALTER table tablename modify 字段名 varchar(100) CHARACTER SET gb2312;来强制指定现有表格的某些字段的字符编码集,总算解决了所有问题。
前两天项目中遇到mysql乱码的问题,折腾了好几天,查了好多资料,最后在恍然大悟中解决了。今天先简单的说说这个事,然后把在这个事中查找学习到的心得记录下来,以与大家分享,亦备后用。
一.我把所有页面,所有请求都编码都统一用utf-8,使用Filter过滤所有request和response都设成utf-8,数据库character_set_database设置utf-8,我知道character_set_client还是默认的latin1但是我在连接数据库时url后面转码了:
useUnicode=true&characterEncoding=UTF-8&autoReconnect=true。
结果问题依旧!哪怕我在代码中用jdbc直接insert into 表 values(中文),在数据库中client用select查询都是乱码,用jdbc查出来打印到日志上是乱码,显示到页面上还是乱码。从数据的"行走"路径看,编码格式都是统一的,应该没有问题,抓狂!难道是url设置的转码没起作用?难道是tomcat对请求自动设置了其它编码?难道跟linux操作系统编码有关?第一种情况最有可能,我找到管服务器的人员,要求修改character_set_client=utf8,结果吃了闭门羹:公司数据库设置都是统一的,不能随便修改;况且以前项目使用的数据库也是这样的设置,可以在程序中解决乱码。对于第二个问题,也是公司服务器上的tomcat,我知道会得到什么回答了,也就不再自讨没趣。对于第三问题,从页面输入和显示的数据,应该跟操作系统没有关系吧,再说了这个改起来更费劲,只是做个参考。继续抓狂!静下心来,从我在代码中用jdbc直接insert into 表 values(中文)这个测试看,跟web传输过程中的编码没有关系,我决定把问题锁定在建立连接时转码问题。又仔细查了几遍,发现我在使用Proxool建立连接池时使用的是properties文件,而原有项目使用的是xml文件,恍然大悟,转码方式不能照搬!于是把
useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
中的amp;全部去掉,重试,页面上出现了笑容灿烂的汉字。高兴!
二.为了这么个简单的问题,查阅了大量资料,从结果上看,并没有直接上用的,可是感觉收获颇多,相信对jsp和mysql乱码的问题又有了进一步的认识。
1.mysql中关于字符集的种类有很多,对我们编程有影响的主要是客户端字符集(character_set_client)和数据库字符集(character_set_database)在写入时Mysq会将客户端指定的字符集转换成数据库字符集存入数据文件,读取时又将数据库字符集转换成客户端指定的字符集展示给客户端,把客户端字符集和数据库字符设置一致,显而易见的好处是免掉转换的性能损耗;另外,如果考虑到以后数据库的迁移,将数据库字符集设置为大多数数据库都支持的字符集会省掉很大麻烦。
1>.客户端字符集的设置有这么几种方法:
A. 使用控制台连接,在my.ini文件中的client项里面设置;
B. 使用ems连接,优先使用ems连接配置的字符集,默认使用my.ini文件中的设置;
C. jdbc连接,在连接串中指定:
jdbc:mysql://192.168.0.10:3306/test?useUnicode=true&characterEncoding=utf-8
2>.几个有关mysql命令行字符集相关的命令
A. 查看 MySQL 数据库服务器字符集,数据库字符集和客户端字符集
show variables like '%char%';
+--------------------------+----------------------------------------+
| character_set_client | latin1 | 客户端字符集
| character_set_connection | latin1 |
| character_set_database | utf8 | 数据库字符集
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 | 服务器字符集
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/mysql/charsets/ |
B. 查看 MySQL 数据表(table) 的字符集
show table status from tablename like '%countries%';
C. 查看 MySQL 数据列(column)的字符集。
show full columns from tablename;
D. 查看当前安装的 MySQL 所支持的字符集。
show char set;
2.我们对数据库的操作无非就是存取数据,在这一过程中,乱不乱码和数据库字符集好像没有什么关系。我们只要保证写入时选择的字符集和读取时选择的字符集一致,即只需保证两次操作的客户端字符集一致并且该字符集支持所存取的数据字符即可.
三.顺次看常见jsp乱码及解决方案:
1.架设服务器安装MYSQL时的会让你选择一种编码,如果这种编码与你的网页不一致,可能就会造成JSP页面乱码.
解决方案:如果安装mysql的编码已不能更改,很多朋友是购买虚拟主机建立网站,无权更改MYSQL的安装编码,这一关我们可以跳过,因为只要后面的步聚正确,一样能解决乱码问题
2.在PHPMYADMIN或mysql-front等系统 创建数据库时会让你选择一种编码,如果这种编码与你的网页不一致,也有可能造成JSP页面乱码.
解决方案:修改数据库编码,如果是数据库编码不正确: 可以在phpmyadmin 执行如下命令: ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin 。这个命令就是将test数据库的编码设为utf8
3.创建表时会让你选择一种编码,如果这种编码与你的网页编码不一致,也可能造成JSP页面乱码
解决方案:修改表的编码:
ALTER TABLE `category` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
这个命令就是将一个表category的编码改为utf8
4.创建表时添加字段是可以选择编码的,如果这种编码与你的网页编码不一致,也可能造成JSP页面乱码
解决方案:修改字段的编码:
ALTER TABLE `test` CHANGE `dd` `dd` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
这个命令就是将test表中 dd的字段编码改为utf8
5.用户提交JSP页面的编码与显示数据的JSP页面编码不一致,就肯定会造成JSP页面乱码.
解决方案:如果是这种情况容易解决,只需检查一下页面,修改源文件的charset即可。如用户输入资料的JSP页面是big5码, 显示用户输入的JSP页面却是gb2312,这种100%会造成JSP页面乱码
6.字符集不正确
解决方案:要注意:
1>.平时你在某些网站看到的文字可能有几种编码, 如你看到一个繁体字,它有可能是big5编码,也有 可能是utf-8编码的,更有可能是gb码的,没错,也就是说有简体编码的繁体字,也有繁体编码的简体字,一定要了解这一点.
2>.如果你是做一个简体编码的网页,编码定为GB2312,如果有香港和台湾地区的访客提交繁体的信息,就可能会造成乱码,解决方法就是(A)将网站编码设为utf-8,这样可以兼容世界上所有字符, (B)如果网站已经运作了好久,已有很多旧数据,不能再更改简体中文的设定,那么建议将页面的编码设为GBK,GBK与GB2312的区别就在于:GBK能比GB2312显示更多的字符,要显示简体码的繁体字,就只能用GBK
7.JSP连接MYSQL数据库语句指定的编码不正确
解决方案:在JSP连接数据库的语句中,带上
useUnicode=true&characterEncoding=UTF-8&autoReconnect=true,
但是千万不要犯和我同样的错误哦。
8.JSP页面没有指定数据提交的编码,就会造成乱码:
解决方案:这种乱码的情况,只需在页面开头加上request.setCharacterEncoding("GBK"); 指定提交的即可。
总而言之,JSP乱码的原因无非就是以上几种,以后再遇到这种问题,先要判断JSP乱码是插入数据库之后乱码,还是JSP页面刚提交过来就乱码了,如果JSP刚接收上一页面的数据显示就乱码了,肯定是字符集不对,可者没有加request.setCharacterEncoding("GBK");
如果是数据库的原因就参考上面的2,3,4种方法
可能是编码问题
这样连接一下数据库看看
jdbc:mysql://localhost:3306/xxxx useUnicode=true&characterEncoding=UTF-8
看看能否有效果
注意:按照以上方法修改以后只能保证你新插入的数据不会乱码,举个例:如果你用户已提交的数据是BIG5,你却想通过以上方法改为可以在GB2312的网页正确显示是不可能的, 这种文字内码的变换只能通过另写程序来解决,请WEB745.com其它相关文章
四.怎么在程序里查看客户端发送给服务器的SQL使用什么编码呢?
在客户端写个程序,执行SQL语句:
public void test() throws SQLException {
ResultSet rs = this.cnn.createStatement().executeQuery("SHOW VARIABLES LIKE 'character_set_%'");
while(rs.next()){
System.out.println(rs.getString(1)+","+rs.getString(2));
}
rs.close();
}
ResultSet rs = this.cnn.createStatement().executeQuery("SHOW VARIABLES LIKE 'character_set_%'");
while(rs.next()){
System.out.println(rs.getString(1)+","+rs.getString(2));
}
rs.close();
}
没有配置characterEncoding=utf-8之前,我使用的是DBURL=jdbc:mysql://192.168.0.10:3306/test?useUnicode=true&characterEncoding=utf-8 这样的配置。结果用test()方法查询结果如下:
character_set_client,latin1
character_set_connection,latin1
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-linux-i686/share/mysql/charsets/
注意第一行就可以了,可见使用的是latin1。
而latin1本身就无法表示汉字,经过这个编码打包的SQL语句发给Server,Server也用Latin1解析也无法还原。
所以,我总是写乱码到DB。
而配置了配置characterEncoding=utf-8之后,
执行select(),结果:
character_set_client,utf8
character_set_connection,utf8
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-linux-i686/share/mysql/charsets/
第一行为utf-8,SQL将用UTF8打包给Server,Server也用Client配置的UTF8解析。
发表评论
-
echarts使用心得
2014-09-14 17:45 11011、同一个页面显示多个图 问题:明明单独都可以显 ... -
在Myeclipse中建立基于Maven的Web Project遇到的问题
2014-08-10 01:59 9711、在部署到TOMCAT7上是总是报Applicati ... -
MyEclipse 快捷键
2014-08-08 17:37 447------------------------------ ... -
面向接口的编程在动态可配置系统开发中的作用
2014-07-05 07:12 0Spring IoC 和DI技术主要作用就是实现了完全的面 ... -
系统技术架构中时时刻刻都要考虑“解耦”
2013-11-09 07:32 506前段时间面试一家企业,公司副总问了我一个问题:作为企业来讲,降 ... -
我自己编写的一个静态发布系统经验分享
2012-02-26 08:18 704说明:近期帮朋友做一个简单的商务网站,要求全部页面静态发布,找 ... -
mysql 导入导出
2012-02-21 23:54 754mysql 导入导出.sql文件2010-01-29 14:4 ... -
MySQL中如何实现select top n
2012-02-20 02:16 2219容易出问题是:limit n子句的位置,要位于orde ...
相关推荐
在开发Web应用时,尤其是使用Java技术栈如JSP、Servlet与MySQL数据库交互时,中文乱码问题常常困扰着开发者。这个问题的出现主要是由于字符编码不一致导致的,包括数据库编码、连接编码、页面编码等多个环节。下面...
遇到了这个问题, 按照一定的顺序解决了, 来这里总结一下, 希望能帮助大家. 咱们从前台到后台的顺序来解决. 1. JSP 这里需要设置一下JSP页面的统一编码格式: 打开Eclipse-window->preferences. 根据...
本文将深入探讨“JSP乱码”的多种解决方案,并提供实用的解决策略。 1. **理解字符编码的基本概念** - 字符编码是计算机对文字进行存储和处理的标准,常见的有ASCII、GBK、UTF-8等。 - JSP页面默认使用ISO-8859-1...
本文将详细介绍如何在MySQL数据库层面解决中文乱码问题,并提供一系列实用的方法和技巧。 #### MySQL配置文件(my.cnf)设置 在MySQL的配置文件`my.cnf`或`my.ini`中设置字符集为UTF-8是非常关键的一步。通过修改...
### jsp乱码解决方案 #### 一、引言 在Web开发中,特别是使用Java Server Pages (JSP)进行开发时,字符编码问题是一个经常遇到的技术难题。如果处理不当,很容易导致网页显示乱码,影响用户体验及数据的正确性。...
本篇文章将深入探讨JSP中文乱码问题的原因、解决策略以及预防措施。 一、乱码产生的原因 1. 字符集不一致:JSP页面、Servlet、HTML、CSS、JavaScript、数据库等环节如果使用的字符集不统一,容易导致中文字符在...
该方案也可以解决jsp+servlet+mysql开发中常见的中文乱码问题,提高开发效率和质量。 jsp+servlet+mysql乱码解决方案是一个非常重要和实用的解决方案,对于jsp+servlet+mysql开发的web应用程序非常有价值。
### JSP乱码问题解决 #### 一、JSP页面显示乱码 在JSP页面开发过程中,中文乱码是一个常见的问题。这个问题主要是由于服务器端和客户端(浏览器)的编码设置不一致导致的。 **原因分析:** 1. **服务器编码设置...
本文将深入探讨JSP乱码的原因及其解决方案,帮助开发者有效地处理这类问题。 ### 1. JSP乱码的成因 - **字符集设置不一致**:JSP文件、HTML页面、HTTP头、Servlet输出以及数据库存储等环节的字符集设置不一致,...
总结来说,解决MySQL数据库的乱码问题,需要从Web应用的前端、后端,以及数据库的配置等多个层面进行细致的检查和调整。确保每个环节的编码一致,特别是在处理中文字符时,使用`UTF-8`编码通常是最安全的选择,因为`...
jsp 乱码详解(jsp,mysql,tomcat) 基本涵盖所有的乱码解决方法。使用的utf-8作为例子
总的来说,解决MySQL数据库乱码问题的关键在于确保整个数据处理链路中,从Web应用到数据库,再到开发工具,所有环节的编码设置保持一致,尤其是与UTF-8兼容。通过上述方法,可以有效地防止和解决乱码问题,确保中文...
jsp中文乱码问题产生的原因是由于jsp页面的编码方式和浏览器的编码方式不一致所致。jsp页面的编码方式默认为ISO-8859-1,而浏览器的编码方式默认为GBK或UTF-8。这样就会导致jsp页面中的中文字符乱码。 解决jsp中文...
解决MySQL连接时中文显示乱码的问题,关键在于确保数据库、连接参数以及应用程序内部各环节的字符集设置保持一致,并采用适合中文字符的编码方式,如UTF-8。通过上述步骤,可以有效避免中文乱码现象,保证数据的正确...
### MySQL数据库乱码问题解析与解决方案 #### 一、引言 在使用MySQL数据库的过程中,字符集设置不当可能会导致数据存储或查询时出现乱码问题。本文将针对MySQL数据库中的乱码现象进行深入分析,并提供相应的解决...
本文将从 JSP、MyBatis 和 MySQL 三个方面来解决中文乱码问题。 JSP 中文乱码解决方案 在 JSP 中,中文乱码的原因主要是浏览器和服务器的编码格式不一致。解决方法是: 1. 在 JSP 页面头部添加 `; charset=UTF-8...
jsp中文乱码 jsp mysql 乱码的解决方法 ...解决 jsp 中文乱码的问题需要从多方面考虑,包括 servlet、jsp 页面和数据库的字符编码问题。只有当所有方面的字符编码是一致的时,才能确保中文字符的正确传输。
通过以上步骤,大部分JSP页面的中文乱码问题都能得到解决。但实际情况可能更复杂,需要根据具体错误现象进行排查。如果使用了`demo`这个压缩包,它可能包含示例代码或工具,帮助我们更直观地理解并实践上述解决方案...
### 如何解决JSP页面显示乱码问题 在JSP(Java Server Pages)开发中,中文乱码问题一直是开发者常见的挑战之一。...通过上述方法,可以有效地解决JSP开发中的中文乱码问题,提高系统的可用性和用户体验。