您好,欢迎访问一九零五行业门户网

Mysql中文乱码解决思路和过程_MySQL

bitscn.com
mysql 中文乱码问题是常见的问题,解决也是不难的,本文将通过我在遇到问题时候,如何的查找和解决为导向,来呈现分析解决问题的思路和过程。
在javaee项目开发中,通常的中文乱码问题分为web前端,web后端,数据库乱码,如果想查看web端的中文乱码问题,请参照博文http://blog.csdn.net/songdeitao/article/details/17577823,一但排除了web端的中文乱码,也就说乱码问题是在数据库端发生的了。
问题产生:首先在创建用户,如图1所示:
图1
在点击增加用户的时候,数据库中username字段显示为乱码:
mysql> select * from t_user;+--------+----------+------+---------------------+-------+| userid | username | age | birthday | isvip |+--------+----------+------+---------------------+-------+| 1 | | 0 | 2014-01-01 00:00:00 | 1 |+--------+----------+------+---------------------+-------+1 row in set (0.00 sec)
解决思路在javaweb项目中,在解决乱码问题之前,首先要确保是在数据库这里发生乱码,如果确实在数据库这端发生乱码,请试着通过以下步骤查找原因:
步骤一:查看数据库编码状态,如下所示:mysql> status;--------------mysql ver 14.12 distrib 5.0.22, for win32 (ia32)connection id: 3current database: stevencurrent user: root@localhostssl: not in useusing delimiter: ;server version: 5.0.22-community-ntprotocol version: 10connection: localhost via tcp/ipserver characterset: latin1db characterset: latin1client characterset: latin1conn. characterset: latin1tcp port: 3306uptime: 2 hours 10 min 15 secthreads: 1 questions: 121 slow queries: 0 opens: 2 flush tables: 1 open tables: 0 queries per second avg: 0.015--------------
发现server,db,client,conn.的字符编码均为latin1,所以一定会出现中文乱码的情况。 解决方案一:(window下) 通过mysql server instance configuration wizard重新设置编码方案,如图2所示:
图2 然后一直next,然后到please select the database usage 的时候选择第三项,如图3所示:
图3 接着一直next,到please select the default character set.的时候选择gbk,字符编码,如图4所示:
图4 这个时候一直next,确认密码后,next,然后就execute执行,如图5所示:
图5 finish后,退出数据库命令控制台然后再进去,查看数据库编码状态,如下所示:mysql> use steven;database changedmysql> status;--------------mysql ver 14.12 distrib 5.0.22, for win32 (ia32)connection id: 2current database: stevencurrent user: root@localhostssl: not in useusing delimiter: ;server version: 5.0.22-community-ntprotocol version: 10connection: localhost via tcp/ipserver characterset: gbkdb characterset: latin1client characterset: gbkconn. characterset: gbktcp port: 3306uptime: 1 min 20 secthreads: 1 questions: 12 slow queries: 0 opens: 0 flush tables: 1 open tables: 6 queries per second avg: 0.150--------------

发现编码除了db characterset外其他的都改为gbk了,这是方案一,依然可以实现这样的更改。
解决方案二:通过配置文件,找到mysql安装的目录,找到根目录下my.ini文件,如图6所示:
图6 然后打开后,进行如下更改,如图7所示:
图7 将latin1更改gbk编码方式,然后将数据库服务重新启动,如下所示:c:/users/administrator>net stop mysqlthe mysql service is stopping.the mysql service was stopped successfully.c:/users/administrator>net start mysqlthe mysql service is starting.the mysql service was started successfully.
这个时候和方案一一样的效果,然而此时并没有解决问题。mysql> use steven;database changedmysql> status;--------------mysql ver 14.12 distrib 5.0.22, for win32 (ia32)connection id: 2current database: stevencurrent user: root@localhostssl: not in useusing delimiter: ;server version: 5.0.22-community-ntprotocol version: 10connection: localhost via tcp/ipserver characterset: gbkdb characterset: latin1client characterset: gbkconn. characterset: gbktcp port: 3306uptime: 1 min 20 secthreads: 1 questions: 12 slow queries: 0 opens: 0 flush tables: 1 open tables: 6 queries per second avg: 0.150--------------

步骤二:改变db characterset的编码方式,执行以下sql语句: --修改数据库编码为gbk alter database steven character set gbk;
其中steven是数据表乱码所在的数据库,这个时候执行status查看mysql> status;--------------mysql ver 14.12 distrib 5.0.22, for win32 (ia32)connection id: 2current database: stevencurrent user: root@localhostssl: not in useusing delimiter: ;server version: 5.0.22-community-ntprotocol version: 10connection: localhost via tcp/ipserver characterset: gbkdb characterset: gbkclient characterset: gbkconn. characterset: gbktcp port: 3306uptime: 8 min 30 secthreads: 1 questions: 32 slow queries: 0 opens: 1 flush tables: 1 open tables: 7 queries per second avg: 0.063--------------
此时都成为gbk的编码格式了。 注:如果此时数据库编码默认就为gbk的编码方式的,此时问题一般都已经解决了,如果还没有解决,在插入含有中文数据的时候会有以下异常:com.mysql.jdbc.mysqldatatruncation: data truncation: data too long for column 'username' at row 1 at com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:3489) at com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:3423) at com.mysql.jdbc.mysqlio.sendcommand(mysqlio.java:1936) at com.mysql.jdbc.mysqlio.sqlquerydirect(mysqlio.java:2060) at com.mysql.jdbc.connectionimpl.execsql(connectionimpl.java:2542) at com.mysql.jdbc.preparedstatement.executeinternal(preparedstatement.java:1734) at com.mysql.jdbc.preparedstatement.executeupdate(preparedstatement.java:2019) at com.mysql.jdbc.preparedstatement.executeupdate(preparedstatement.java:1937) at com.mysql.jdbc.preparedstatement.executeupdate(preparedstatement.java:1922) at com.steven.util.daohandle.executedml(daohandle.java:49) at com.steven.dao.impl.userdao.docreate(userdao.java:33) at com.steven.model.useraddaction.execute(useraddaction.java:80) at com.steven.controller.actionservlet.dopost(actionservlet.java:40) at javax.servlet.http.httpservlet.service(httpservlet.java:643) at javax.servlet.http.httpservlet.service(httpservlet.java:723) at org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:290) at org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) at com.steven.util.encodefilter.dofilter(encodefilter.java:35) at org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:235) at org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) at org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:233) at org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:191) at org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:127) at org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:103) at org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:109) at org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:293) at org.apache.coyote.http11.http11processor.process(http11processor.java:861) at org.apache.coyote.http11.http11protocol$http11connectionhandler.process(http11protocol.java:606) at org.apache.tomcat.util.net.jioendpoint$worker.run(jioendpoint.java:489) at java.lang.thread.run(thread.java:722)
说数据过长,此时查看数据表默认编码方式如下所示:mysql> show create table t_user;+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| table | create table |+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| t_user | create table `t_user` ( `userid` int(10) not null auto_increment, `username` varchar(100) not null, `age` int(2) default null, `birthday` datetime default null, `isvip` tinyint(1) default null, primary key (`userid`)) engine=myisam default charset=latin1 |+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)
会发现数据表默认编码是latin1,所以异常的原因就是中文的编码和表的默认编码不匹配,造成数据冲突引起的。
步骤三:解决异常执行以下两句进行更改数据库的默认编码方式; 方案一:drop表,然后重新建表,建表语句如下所示;create table t_user( userid int(10) not null primary key auto_increment, username varchar(100) not null, age int(2), birthday datetime, isvip boolean) default charset=gbk;
方案二:mysql自带的命令执行以下两句命令:--修改表默认用gbkalter table t_user character set gbk;--修改username字段编码为gbkalter table t_user modify username varchar(100) character set gbk;
执行完之后,数据库字段和表的编码方式都更改为了gbk,此时在进行插入数据时候,数据表中的数据为:mysql> select * from t_user;+--------+----------+------+---------------------+-------+| userid | username | age | birthday | isvip |+--------+----------+------+---------------------+-------+| 1 | | 0 | 2014-01-01 00:00:00 | 1 || 2 | 元旦快乐 | 0 | 2014-01-01 00:00:00 | 1 |+--------+----------+------+---------------------+-------+2 rows in set (0.00 sec)
第一条为乱码时候插入的数据,第二条为解决后插入的数据,此时mysql数据库编码已经解决了。
总结:对于数据库乱码解决方案,可以归纳如下: 通过软件或者配置文件进行第一步修改编码通过mysql命令更改数据库编码(如果默认编码支持中文,此步骤就可以省略了)发生data too long for column……异常,进行数据表字符编码更改 一般情况的mysql数据库中文编码问题即可得到解决,编码同样可以设置成utf8编码方式,但有时会出现数据库中编码是繁体字的现象,然后执行set names gbk命令,即可成功显示简体中文。
下面提供常用的修改中文字符乱码的mysql命令:set names 'gbk'; --它相当于下面的三句指令: set character_set_client = gbk; set character_set_results = gbk; set character_set_connection = gbk; --显示数据表表的编码 show create table t_user(表的名称); --修改数据库编码为gbk alter database steven(数据库的名称) character set gbk; --修改表默认用gbkalter table t_user(表的名称) character set gbk;--修改username字段编码为utf8alter table t_user(表的名称) modify username(表中字段的名称) varchar(100) character set gbk; --创建表create table t_user( userid int(10) not null primary key auto_increment, username varchar(100) not null, age int(2), birthday datetime, isvip boolean) default charset=gbk;
bitscn.com
其它类似信息

推荐信息