java mysql 字符集_在Java中解决MySQL5.0中文字符集问题全程详细记录

本文详细记录了解决MySQL5.0在Java环境下中文字符集显示乱码的问题,包括创建数据库和表时指定字符集,设置连接字符集,修改MySQL配置文件以及通过Java JDBC插入和查询中文字符的步骤。
摘要由CSDN通过智能技术生成

今天被MySQL的中文字符集问题弄得焦头烂额,最终还是解决了.下面分享一下解决过程。

在网上搜索了很多,网友也有很多精彩的帖子,

但是每个人的情况不总是一样,所以我觉得我下面的文字有存在的必要。

装了MySQL5.0后,系统默认的字符集似乎是UTF8,但是不知道为什么就是不支持中文。

下面的是我的痛苦的解决过程。

将数据库用character set 和 collate指定字符集为gbk,

mysql> create database test2  DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

Query OK, 1 row affected (0.00 sec)

mysql> create table a(a text);

Query OK, 0 rows affected (0.14 sec)

插入的时候也用_gbk指定字符集,

mysql> insert a values(_gbk'默认数据库的字符集和');

Query OK, 1 row affected (0.05 sec)

但是查询的时候还是出现乱。

mysql> select * from a;

+--------------------------------+

| a                              |

+--------------------------------+

| 榛樿鏁版嵁搴撶殑瀛楃闆嗗拰           |

+--------------------------------+

1 row in set (0.00 sec)

mysql>

好的,那么是不是创建表也要指定字符集呢?

我们继续测试:

mysql> create table b(a text) DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

Query OK, 0 rows affected (0.06 sec)

mysql> insert b values(_gbk'默认数据库的字符集和');

Query OK, 1 row affected (0.01 sec)

mysql> select * from b;

+--------------------------------+

| a                              |

+--------------------------------+

| 榛樿鏁版嵁搴撶殑瀛楃闆嗗拰           |

+--------------------------------+

1 row in set (0.00 sec)

mysql>

同样出现乱码?

我们不用_gbk指定字符集呢?

mysql> insert b values('默认数据库的字符集和');

ERROR 1406 (22001): Data too long for column 'a' at row 1

mysql> insert a values('默认数据库的字符集和');

ERROR 1406 (22001): Data too long for column 'a' at row 1

这样发现根本就插入不进数据。

那么到底该怎么解决呢?

运行下面的这几行命令,就能看到正常的中文了:

mysql> SET character_set_connection = gbk;

Query OK, 0 rows affected (0.00 sec)

mysql> SET character_set_database = gbk;

Query OK, 0 rows affected (0.00 sec)

mysql> SET character_set_results = gbk;

Query OK, 0 rows affected (0.00 sec)

mysql> SET character_set_server = gbk;

Query OK, 0 rows affected (0.00 sec)

mysql>

mysql> SET collation_connection = gbk_bin;

Query OK, 0 rows affected (0.00 sec)

mysql> SET collation_database = gbk_bin;

Query OK, 0 rows affected (0.00 sec)

mysql> SET collation_server = gbk_bin;

Query OK, 0 rows affected (0.00 sec)

mysql>

mysql> select * from a;

+----------------------+

| a                    |

+----------------------+

| 默认数据库的字符集和                  |

+----------------------+

1 row in set (0.00 sec)

mysql> select * from b;

+----------------------+

| a                    |

+----------------------+

| 默认数据库的字符集和                  |

+----------------------+

1 row in set (0.00 sec)

mysql>

这样设置之后,也可以正常插入中文了:

mysql> insert into a values('当然是联系 java ');

Query OK, 1 row affected (0.02 sec)

mysql> select * from a;

+----------------------+

| a                    |

+----------------------+

| 默认数据库的字符集和                  |

| 当然是联系 java              |

+----------------------+

2 rows in set (0.00 sec)

mysql>

但是如果重启数据库客户端,那么还是不能正确显示中文,

最彻底的方法就是更改MySQL的配置文件。

在MySQL5.0的安装目录找到my.ini文件,将其中以下两行:

default-character-set=utf8

default-character-set=utf8

改为:

default-character-set=gbk

default-character-set=gbk

重启MySQL服务器。

重新连接:

mysql> select * from a;

+----------------------+

| a                    |

+----------------------+

| 默认数据库的字符集和 |

| 当然是联系 java      |

+----------------------+

2 rows in set (0.02 sec)

现在好了,可以直接读取中文字符了。

看看插入中文字符情况:

mysql> insert b values('看看插入中文字符情况:');

mysql> insert b values('看看插入中文字符情况:');

Query OK, 1 row affected (0.03 sec)

mysql> select * from b;

+------------------------+

| a                      |

+------------------------+

| 默认数据库的字符集和   |

| 看看插入中文字符情况: |

+------------------------+

2 rows in set (0.00 sec)

mysql>

下面再看看创建表的情况:

mysql> create table c(a text);

Query OK, 0 rows affected (0.06 sec)

mysql> insert into c values();

Query OK, 1 row affected (0.01 sec)

mysql> insert into c values('下面再看看创建表的情况:');

Query OK, 1 row affected (0.02 sec)

mysql> select * from c;

+--------------------------+

| a                        |

+--------------------------+

| NULL                     |

| 下面再看看创建表的情况: |

+--------------------------+

2 rows in set (0.00 sec)

mysql>

一切正常了。

下面看看程序中的情况:

package test;

/**

* 该程序用来测试JDBC和MySQL连接,然后插入中文字符到数据库中。

* 其中用到的表为:

* CREATE TABLE MessageBoard (

* ID int(10) unsigned NOT NULL default '0',

* title varchar(255) NOT NULL default '',

* content text NOT NULL,

* author varchar(20) NOT NULL default '',

* time datetime NOT NULL default '0000-00-00 00:00:00',

* modifyTime datetime NOT NULL default '0000-00-00 00:00:00',

* PRIMARY KEY (ID)

* ) ;

*

*/

import java.sql.*;

public class InsertChineseCharacterJDBC

{

static

{

try

{

//驱动和odbc不同

Class.forName ( "org.gjt.mm.mysql.Driver" );

System.out.println ( "success loading mysql Driver...." );

} catch ( Exception e )

{

System.out.println ( "Error loading mysql Driver....." );

e.printStackTrace ( );

}

}

/**

* @param args

*/

public static void main ( String agrs[] )

{

try

{

//连接参数与Access不同

String url = "jdbc:mysql://localhost/BohaoDB";

//建立连接

Connection con = DriverManager.getConnection ( url, "root", "011124" );

//建立发送SQL命令的Statement对象

Statement stmt = con.createStatement ( );

//返回查询结果

int flag = stmt.executeUpdate ( "insert into MessageBoard(ID,title,content,author,time,modifyTime) values(1,'大家好!','我是新来,请多多关照!','zieckey','2007-01-28 20:03:50','2007-01-27 20:03:50');" );

if ( 1==flag )

{

System.out.println ("插入中文字符到数据库成功!");

}else {

System.out.println ("插入中文字符到数据库失败!");

}

ResultSet rs = stmt.executeQuery ( "select * from MessageBoard" );

/**

* 取出列属性!

*/

ResultSetMetaData md = rs.getMetaData ( );

int col = md.getColumnCount ( );

for ( int i = 1; i <= col; i++ )

{

System.out.println ( md.getColumnName ( i ) + "\t" );

}

/**

* 取出列值!

*/

while ( rs.next ( ) )

{

String strData = "";

for ( int i = 1; i <= col; i++ )

{

strData = strData + rs.getString ( i ) + "\t";

}

System.out.println ( strData );

}

//断开Connection连接

rs.close();

stmt.close();

con.close ( );

} catch ( SQLException e )

{

e.printStackTrace ( );

}

}

}

运行输出:

success loading mysql Driver....

插入中文字符到数据库成功!

ID

title

content

author

time

modifyTime

1 大家好! 我是新来,请多多关照! zieckey 2007-01-28 20:03:50.0 2007-01-27 20:03:50.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值