陌上花开

遇高山,我御风而翔,逢江河,我凌波微波

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
最近一个项目,用到了mysql数据库,很不幸的是我遇到了乱码问题,分析了一下,我觉得不是网页的问题.因为,我在MYSQL里直接添加中文的数据能在网页上正常显示,可是在网页中操作添加的数据,到MYSQL数据库里一看,全是???问号.跟踪看了下,程序中最后处理到数据库操作时,还是中文,操作到数据库后,就是?问号了,能在mysql表中直接添加中文数据并能在网页上正常显示,说明数据库表的编码是对的,程序中最后处理的数据也是中文,这也说明程序中也没有问题,问题可能出在MYSQL数据库连接字符串上,于是我把mysql数据库连接字符串改为:  jdbc:mysql://localhost:3306/xxxx?useUnicode=true&characterEncoding=UTF-8(有时可能需要将符号(&)转码写成(&)),试了一下,还是不行,百思不得其解,就问了下google,有人说,可能是数据库的默认编码错误,原因在于MYSQL服务器使用的默认编码,在没指定数据库的字符编码时,创建的数据库就使用MYSQL服务器的默认编码,但是,如果MYSQL服务器的配置文件没有指定编码时,很可能就是使用的latin1编码.
查看服务器和数据库使用何种编码的MYSQL命令为:
SHOW VARIABLES LIKE 'character_set_%'; 
以及 SHOW VARIABLES LIKE 'collation_%';
看到里面使用的编码了,我本以为应该使用的是utf8,所以,不是utf8的,那就说明问题在这里了.

运行命令:SHOW VARIABLES LIKE 'character_set_%'; 结果如下
'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'latin1'
'character_set_filesystem', 'binary'
'character_set_results', 'utf8'
'character_set_server', 'latin1'
'character_set_system', 'utf8'
'character_sets_dir', 'D:\soft_work\mysql\share\charsets\'
果然发现有几个不对的
运行命令:SHOW VARIABLES LIKE 'collation_%'; 结果如下
'collation_connection', 'utf8_general_ci'
'collation_database', 'latin1_general_ci'
'collation_server', 'latin1_general_ci'

只要把那几个的编码改成utf8的,那应该就可以了.
1: 在Mysql的配置文件 my.ini里加上服务器的默认编码配置: default-character-set=utf8
2: 修改你的数据库的字符编码:进入Mysql数据库,通过命令修改你的数据库字符编码:
ALTER DATABASE `databaseName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci 
(修改后需要重启Mysql数据库)
3: 如果你的表以及表里的字段使用了不正确的字符编码,同样需要修正过来:命令:
 修改表的编码: ALTER TABLE `tableName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
 修改字段的编码: ALTER TABLE `tableName` CHANGE `dd` `dd` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
(做好了时,在看一下上面那两个查看字符编码的命令,看看是否全部都变成了utf8)
把mysql数据库的编码改为utf8后,有试了一下程序,发现不在是乱码了,终于好了,
总结,mysql的乱码有一下几个方面
1,JSP设计页面上是中文,但运行时看到的是乱码,如果是这种情况,就要指定jsp页面的编码,默认情况下,jsp页面的编码是ISO-8859-1,解决方法就是在jsp页面的编码地方加入
<%@ page language="java" contentType="text/html;charset=utf8" %>,
2 ,当用Request对象获取客户提交的汉字时,会出现乱码,那么就需要在项目中加入filter了,(filter在tomcat中自带的有例子,可以照着例子改一下,也可以在googl中搜索一下)
3,由于使用doget方法引起的乱码,可以试着使用dopost提交,
或者是打开tomcat的server.xml文件,找到区块,加入如下一行: 

URIEncoding=”GBK” 

完整的应如下: 
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100" debug="0"
 connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="utf8"/>
需要重启tomcat,

4,写入到数据库是乱码:
如果你是通过JDBC直接链接数据库的时候,配置的代码如下:
jdbc:mysql://localhost:3306/xxxxx?useUnicode=true&characterEncoding=utf8
这样保证到数据库中的代码是不是乱码。

5,如按照上述步骤解决,写到数据库中的还是乱码,就要检查数据库,表的编码方式了,如果跟程序中的不一致,就要按照本文的介绍的方法修改数据库或者是表的编码了。

posted on 2010-03-01 15:52 askzs 阅读(6227) 评论(0)  编辑  收藏 所属分类: mysql

只有注册用户登录后才能发表评论。


网站导航:
 
我要啦免费统计