热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Mysql中文乱码解决思路和过程_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
推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了StartingzookeeperFAILEDTOSTART相关的知识,希望对你有一定的参考价值。下载路径:https://ar ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
author-avatar
air12345
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有