问题描述:
在Linux下,通过Myeclipse平台,JDBC连接Mysql数据库。关键字:中文乱码。
问题分析:
首先要知道数据的流向问题:
信息输入路径:client→connection→server;
信息输出路径:server→connection→results。
换句话说,每个路径要经过3次改变字符集编码。以出现乱码的输出为例,server里utf8的数据,传入connection转为latin1,传入 results转为latin1,utf-8页面又把results转过来。如果两种字符集不兼容,比如latin1和utf8,转化过程就为不可逆的, 破坏性的。所以就转不回来了。
解决办法:
(1)Mysql:
Mysql5.0 字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。
查看系统的字符集和排序方式的设定可以通过下面的两条命令:
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
上面列出的值就是系统的默认值。
一般就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连 接层上。解决方法是在发送查询前执行一下下面这句:
SET NAMES 'utf8';
它相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
但这里要声明一点,“SET NAMES UTF8”作用只是临时的,MySQL重启后就恢复默认了。
一劳永逸的做法是修改数据库的my.conf。
安装好数据库后,一般要将/usr/share/mysql文件夹下的my-larger.conf my-medium.cnf
my-small.cnf 中的任意一个拷贝到/etc下,重命名为my.cnf。然后在my.cnf文件中,分别在[client]和[mysqld]下添加default-character-set=utf8。即修改默认的字符集。保存后重新启动数据库服务。(/sbin/service mysql restart)。
重启后,通过show create table tablename;可以查看表的默认编码。如果表是在修改my.conf以前创建的,那么这些表的默认编码将保持修改my.conf之前的状态。可以通过下面的sql语句修改:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name; 例如:
ALTER TABLE T1 CONVERT TO CHARACTER SET utf8;
(2) 数据库连接语句:
jdbc:mysql://127.0.0.1:3306/scp?useUnicode=true&characterEncoding=utf8
最后一项utf8。
(3) 设置Myeclipse(GA8.5):
Windows->Preferences->General->Content Types->Text,选择java,设置下面的Default encoding为UTF-8。
重启。
文章来源:http://hi.baidu.com/crashice/blog/item/d65d2837296ebebad1a2d372.html