- 论坛徽章:
- 0
|
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
1 大家好! 我是新来,请多多关照! zieckey 2007-01-28 20:03:50.0 2007-01-27 20:03:50.0
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/16292/showart_238850.html |
|