2007-04-23

在ubuntu6.06下解决java和mysql乱码问题

系统环境如下:
OS:Ubuntu6.06LTS
JDK1.6, 直接在sun公司的网站上下载bin包进行安装.
MYSQL5.0, 通过sudo apt-get install mysql-server的方式进行你方式进行安装.
eclipse3.2.1, 在eclipse.org上下载解压得.

Ubuntu系统默认的编码是zh_CN.UTF-8,
通过在java程序中System.getenv()得来

mysql默认的编码是ISO-8859-1,
apt-get安装安mysql后,就会自动启动mysql服务.
mysql -uroot -p登录后,输入

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

可以得知系统的默认编码情况

在不更改数据库的设置和系统设置的前提下
打开终端,输入:
mysql -uroot -p --default-character-set=utf8
注意:必须加上--default-character-set=utf8,才能在控制台正确查看utf字符.
建立数据库:
create database hibernate30 default character set utf8;
建表:

use hibernate30;
create table tb_users (
id int,
name varchar(100)
);

插入数据:
insert into tb_users values (1, '中文测试数据');
查询:
select * from tb_users;
得出结果:

+------+--------------------+
| id | name |
+------+--------------------+
| 1 | 中文测试数据 |
+------+--------------------+
1 row in set (0.00 sec)

至此,mysql数据库配置完毕.以下配置java环境.

在eclipse中输入java代码如下:

String url = "jdbc:mysql://localhost:3306/hibernate30?user=root&password=&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8";
String sql = null;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;

if (! DbUtils.loadDriver("com.mysql.jdbc.Driver")){
log.error("can't load jdbc driver!");
return;
}
conn = DriverManager.getConnection(url);

stmt = conn.createStatement();
sql = "insert into tb_users values (1, '中文测试')";
stmt.executeUpdate(sql);

sql = "select * from tb_users";
rs = stmt.executeQuery(sql);
while (rs.next()) {
log.info(rs.getObject(1));
log.info(rs.getObject(2));
}
DbUtils.close(rs);
DbUtils.close(stmt);
DbUtils.close(conn);

需要注意的就是: url的写法.
需要添加useUnicode=true&characterEncoding=utf8&characterSetResults=utf8的参数
最后运行则是正常的结果.

总结:
系统编码,数据库编码,应用编码必须保存一致.



另外:
在其他的网上有设置mysql全局的默认字符,操作如下:

在某些时候,我们续要修改mysql默认数据库的编码,以保证某些迁移的程序可以正常显示,编辑my.cnf文件进行编码修改,windows可以直接用Mysql Server Instance Config Wizard 进行设置

在linux下修改3个my.cnf的1个/etc/mysql/my.cnf文件

找到客户端配置[client] 在下面添加
default-character-set=utf8 默认字符集为utf8
在找到[mysqld] 添加
default-character-set=utf8 默认字符集为utf8
init_connect='SET NAMES utf8' (设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行)

修改好后,重新启动mysql 即可,查询一下show variables like 'character%';

+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

这样就方便在建立库的时候,设置数据库的默认编码了.

没有评论: