By zieckey (http://zieckey.cublog.cn)
                               All Rights Reserved!


      今天被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