今天被MySQL的中文字符集問題弄得焦頭爛額,最終還是解決了.下面分享一下解決過程。
在網(wǎng)上搜索了很多,網(wǎng)友也有很多精彩的帖子,
但是每個人的情況不總是一樣,所以我覺得我下面的文字有存在的必要。
裝了MySQL5.0后,系統(tǒng)默認的字符集似乎是UTF8,但是不知道為什么就是不支持中文。
下面的是我的痛苦的解決過程。
將數(shù)據(jù)庫用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'默認數(shù)據(jù)庫的字符集和');
Query OK, 1 row affected (0.05 sec)
但是查詢的時候還是出現(xiàn)亂。
mysql> select * from a;
+--------------------------------+
| a |
+--------------------------------+
| 榛樿鏁版嵁搴撶殑瀛楃闆嗗拰 |
+--------------------------------+
1 row in set (0.00 sec)
mysql>
好的,那么是不是創(chuàng)建表也要指定字符集呢?
我們繼續(xù)測試:
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'默認數(shù)據(jù)庫的字符集和');
Query OK, 1 row affected (0.01 sec)
mysql> select * from b;
+--------------------------------+
| a |
+--------------------------------+
| 榛樿鏁版嵁搴撶殑瀛楃闆嗗拰 |
+--------------------------------+
1 row in set (0.00 sec)
mysql>
同樣出現(xiàn)亂碼?
我們不用_gbk指定字符集呢?
mysql> insert b values('默認數(shù)據(jù)庫的字符集和');
ERROR 1406 (22001): Data too long for column 'a' at row 1
mysql> insert a values('默認數(shù)據(jù)庫的字符集和');
ERROR 1406 (22001): Data too long for column 'a' at row 1
這樣發(fā)現(xiàn)根本就插入不進數(shù)據(jù)。
那么到底該怎么解決呢?
運行下面的這幾行命令,就能看到正常的中文了:
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 |
+----------------------+
| 默認數(shù)據(jù)庫的字符集和 |
+----------------------+
1 row in set (0.00 sec)
mysql> select * from b;
+----------------------+
| a |
+----------------------+
| 默認數(shù)據(jù)庫的字符集和 |
+----------------------+
1 row in set (0.00 sec)
mysql>
這樣設(shè)置之后,也可以正常插入中文了:
mysql> insert into a values('當然是聯(lián)系 java ');
Query OK, 1 row affected (0.02 sec)
mysql> select * from a;
+----------------------+
| a |
+----------------------+
| 默認數(shù)據(jù)庫的字符集和 |
| 當然是聯(lián)系 java |
+----------------------+
2 rows in set (0.00 sec)
mysql>
但是如果重啟數(shù)據(jù)庫客戶端,那么還是不能正確顯示中文,
最徹底的方法就是更改MySQL的配置文件。
在MySQL5.0的安裝目錄找到my.ini文件,將其中以下兩行:
default-character-set=utf8
default-character-set=utf8
改為:
default-character-set=gbk
default-character-set=gbk
重啟MySQL服務(wù)器。
重新連接:
mysql> select * from a;
+----------------------+
| a |
+----------------------+
| 默認數(shù)據(jù)庫的字符集和 |
| 當然是聯(lián)系 java |
+----------------------+
2 rows in set (0.02 sec)
現(xiàn)在好了,可以直接讀取中文字符了。
看看插入中文字符情況:
mysql> insert b values('看看插入中文字符情況:');
mysql> insert b values('看看插入中文字符情況:');
Query OK, 1 row affected (0.03 sec)
mysql> select * from b;
+------------------------+
| a |
+------------------------+
| 默認數(shù)據(jù)庫的字符集和 |
| 看看插入中文字符情況: |
+------------------------+
2 rows in set (0.00 sec)
mysql>
下面再看看創(chuàng)建表的情況:
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('下面再看看創(chuàng)建表的情況:');
Query OK, 1 row affected (0.02 sec)
mysql> select * from c;
+--------------------------+
| a |
+--------------------------+
| NULL |
| 下面再看看創(chuàng)建表的情況: |
+--------------------------+
2 rows in set (0.00 sec)
mysql>
一切正常了。
下面看看程序中的情況:
package test; /** * 該程序用來測試JDBC和MySQL連接,然后插入中文字符到數(shù)據(jù)庫中。 * 其中用到的表為: * 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 { //驅(qū)動和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 { //連接參數(shù)與Access不同
String url = "jdbc:mysql://localhost/BohaoDB"; //建立連接
Connection con = DriverManager.getConnection ( url, "root", "011124" ); //建立發(fā)送SQL命令的Statement對象
Statement stmt = con.createStatement ( ); //返回查詢結(jié)果
int flag = stmt.executeUpdate ( "insert into MessageBoard(ID,title,content,author,time,modifyTime) values(1,'大家好!','我是新來,請多多關(guān)照!','zieckey','2007-01-28 20:03:50','2007-01-27 20:03:50');" ); if ( 1==flag ) { System.out.println ("插入中文字符到數(shù)據(jù)庫成功!"); }else { System.out.println ("插入中文字符到數(shù)據(jù)庫失敗!"); } 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....
插入中文字符到數(shù)據(jù)庫成功!
ID
title
content
author
time
modifyTime
1 大家好! 我是新來,請多多關(guān)照! zieckey 2007-01-28 20:03:50.0 2007-01-27 20:03:50.0