分享

解决Mysql+Java的中文乱码问题(学习心得)

 计科图书 2014-08-16

        最近几天一直都在学JSP,我用的数据库是Mysql。在连接数据库的过程中,刚开始我只是简单的执行了查询命令,发现从数据库取出的中文数据全部显示成了乱码,查了一些资料之后,我先用了下面的一个转换函数,值得高兴的是,读出的中文显示正常:

 

 

     

     

     将从Mysql数据库中得到的中文数据,通过以下转换函数 String trans(String chi)进行处理,即可正常显示中文:

    

    String trans(String chi) {

        String result = null;

        byte temp[];

        try {

            temp = chi.getBytes("iso-8859-1");

            result = new String(temp);

        } catch(UnsupportedEncodingException e) {

            System.out.println(e.toString());

        }

        return result;

}

 

 

但很快,我意识到这种方法只是治标不治本,因为在插入中文数据时,又没法在Mysql中正常显示中文。而真正治本的方法是,将Mysql的编码格式由默认的latin1改成gb2312.

 

 

 

 

改的步骤如下:

 

1.      设置Mysql的编码格式(注意是在创建数据库之前就要设置)

 

找到Mysql安装目录下的 myini文件,用记事本打开,找到以下两句:

 

 

[mysql]

 

default-character-set=latin1

 

--------------------------------------------------------------------------------------------------

 

[mysqld]

 

# The TCP/IP Port the MySQL Server will listen on

port=3306

 

 

#Path to installation directory. All paths are usually resolved relative to this.

basedir="C:/Program Files/MySQL/MySQL Server 5.0/"

 

#Path to the database root

datadir="C:/Program Files/MySQL/MySQL Server 5.0/Data/"

 

# The default character set that will be used when a new schema or table is

# created and no character set is defined

default-character-set=latin1

 

 

 

 

 

                  我们需要做的是将这两处的默认编码格式由“latin1”改成“gb2312”。

 

                  改好之后,重启Mysql

 

 

 

 

2.      Mysql中开始创建数据库

   用相关命令创建数据库,表等

 

注意: 在创建表时要加上一句 TYPE=MyISAM, default character set gb2312;

    

   如以下示例:

    create table student

    -> (sno varchar(20),

    -> sname varchar(10),

    -> sex char(2),

    -> age numeric(2),

    -> dept varchar(20),

    -> primary key(sno))

    -> type=myisam,default character set gb2312;

    

3.      Java文件或者JSP文件中连接数据库

 

   Java代码中:

 

str = "com.mysql.jdbc.Driver";

url="jdbc:mysql://localhost:3306/example?useUnicode=true&characterEncoding=gb2312";

user = "root";

password = "123456";

            

Class.forName(str).newInstance();

     conn = DriverManager.getConnection(url,user,password);

 

 

   JSP中需要注意的有:

 

<%@page contentType="text/html"%>

<%@page pageEncoding="gb2312" %>

<%@ page import="java.sql.*,java.io.*" %>

 

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

 

 

 

 

             

             OK,经过上述一些设置之后,JAVAMysql将不会再出现中文显示乱码!



 

一、网上的解决方案很多,但是试了几个都没成功。能改的地方都改了,my.ini里两个地方[mysql][mysqld]都改成了gbk,又多此一举跑MySQLInstanceConfig.exe里也设置了默认字符集为gbk,还有在数据库里也使用了charset gbk来更改字符集,可无一例外中文还是插不进去。

最后在http://youshini./blog/1073053上又找到一个解决方案,在数据库里使用了alter table content modify author varchar(30) character set gbk;这句话之后成功插入了中文!心中那个鸡冻啊。

现在知道了,前面把my.ini或者在MySQLInstanceConfig.exe里改变了编码字符集之后只对以后创建的表起作用,对于以前创建的表要使用alter table content modify author varchar(30) character set gbk才可以插入中文,当然,嫌这样一个字段一个字段的修改太麻烦可以使用ALTER TABLE OLD_TABLE CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]直接对整个表操作。
。这里把问题及解决方案贴出方便后来人!个人总结出mysql数据库要正常插入中文需要三个地方字符集一致:

1mysql的初始化字符集(my.ini中修改)

2、某个具体的database中通过charset gbk或者\c gbk修改

3、最后这个不是必须的,只是如果在中途改了以上两个字符集才需要在此修改。把表中的字段改成和上面两种一样的字符集:通过ALTER TABLE OLD_TABLE CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]修改

 

 

二、最后再附上一篇整体概述的设置mysql支持中文的文章,转于51cto.com

MySQL数据库默认编码已经是utf8了, default-character-set utf8,可是向数据库中表中插入中文时,却老是出现 ....\xB5\xA5\xD1\xA1 for column...这样的错误,经过查阅网上类型的错误后,发现一个很奇妙的现象,接下来我们就来开始介绍。

1)、在安装数据库时就设定字符集编码为utf8的环境下

1.在当前字符集编码为:

Server characterset:    utf8  

 

Db      characterset:    utf8  

 

Client  characterset:    utf8  

 

Conn.  characterset:    utf8 

下创建数据库:

1)插入中文数据,操作不能成功。

2)修改字符集编码为:

Server characterset:    utf8  

 

10 Db       characterset:   utf8  

11  

12 Client  characterset:    gbk  

13  

14 Conn.  characterset:    gbk 

插入中文数据,显示正常。

2)、在安装数据库时就设定字符集编码为gbk的环境下

1.当前字符集编码是:

15 Server characterset:    gbk  

16  

17 Db      characterset:    gbk  

18  

19 Client  characterset:   gbk  

20  

21 Conn.  characterset:   gbk  

下创建数据,插入中文数据,操作正常,显示正常。

2.当前字符集编码为utf8:

22 Server characterset:   gbk  

23  

24 Db      characterset:    utf8  

25  

26 Client  characterset:   utf8  

27  

28 Conn.  characterset:   utf8 

3.当前字符集编码为utf8:

29 Server characterset:    gbk  

30  

31 Db      characterset:    gbk  

32  

33 Client  characterset:   utf8  

34  

35 Conn.  characterset:   utf8 

插入中文数据,操作不能执行。

结论:要想能向数据库正常插入中文,必须满足以下条件:

1.要把字符集设定为能支持中文的gbk或则utf8;

2.把数据库的Client Characterset和Conn. Characterset的字符集都设定为gbk;

根据上面的提示 ,我更改了:

36 SET  character_set_client=gbk;  

37  

38 SET character_set_connection=gbk; 

之后再尝试想数据库插入中文,这时没有出错,能插入可是查询出来是乱码。

最后再更改; 

39 SET character_set_results=gbk; 

这样之后,所有的问题都解决了,能正常插入也能正常显示了。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多