在用 jdbc 向 mysql 数据库插入中文时出现了乱码,严格来说是通过 Hibernate。记录下搜索和查文档以后找到的解决办法。
- 首先要告诉数据库要插入的字符串使用的字符集,mysql 默认使用的字符集是 latin1。我要保存的字符串是 UTF-8 编码的(字符集是 Unicode),所以包含这个字段的表应该使用 UTF-8 编码。这里有几种解决办法。
- 在建立数据库的时候指定数据库的字符集编码,这样,这个数据库的所有表都会默认使用数据库的字符集编码。如
create database foo charset utf8;
- 在建表的时候指定字符集编码。如
create table foo (id char(20)) charset utf8;
- 指定某一列使用的字符集编码。如
create table foo (id char(20) charset utf8);
如果你有需要的话还可以指定字符排序的规则,也就是指定 collation,如
create database foo charset utf8 collate utf8_general_ci;
,同样也可以指定单独的表、列使用的 collation 规则。 - 在建立数据库的时候指定数据库的字符集编码,这样,这个数据库的所有表都会默认使用数据库的字符集编码。如
- 然后在使用 jdbc 连接数据库的时候要告知 jdbc 使用什么字符集编码来跟服务器通信。很简单,只需要在 jdbc 指定数据库路径时做一点修改就可以了。比如,
jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf8
。注意如果在 XML 文件里面的话 “&” 要改成 “&”。
如果你使用的是 gbk 编码的话把上面所有提到 utf8 的地方改成 gbk 应该就可以了,只要服务器和客户端使用的字符集编码统一就可以了。
mysql 命令行客户端默认使用的字符集也是 latin1,如果你通过这个来插入中文的话也会出现乱码的情况。解决的办法是执行语句 set names 'utf8'
来告诉服务器使用 UTF-8 编码来和客户端通信。你也可以使用set charset 'utf8'
,它和 set names 区别只在于
collation 上。set names 和 set charset 都相当于执行了三条语句,具体的内容可以去看 mysql 文档 10.4 节。我想这个方法在使用 jdbc 的时候也是可以的,所以如果 jdbc 的指定数据库地址中没有告知使用的字符集编码的话可以通过执行上面的语句来达到相同的效果。
先说一下我的环境,windows XP,mysql5.0安装版,rails1.2.3。
试过的解决方法有3种:
1。重新利用 MySQL Server instance Config Wizard向导,重新Reconfigure Instance。改编码为utf8
2。修改MySQL文件夹下的my.ini文件。如下:
[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
3。SET character_set_client =utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
可输入mysql>SHOW VARIABLES LIKE '%character%' ;命令查看效果。
以上方式前2种其实是一个原理,看你习惯怎么改罢了,而设置的值正是上图中的character_set_database和character_set_server.
这些都是网上一搜一大片的处理方式,在这里也做一个总结。但我通过以上方式去做了以后,非但乱码问题没有解决,而且数据库表中再无法插入中文。