【IT168 服务器学院】环境:
OS:debian 3.1 sarge
MySQL:4.0.24
JDBC:3.1.8
Tomcat:5.0
1、创建数据库
根据我的习惯,我一般使用SQL文件来创建数据库,并且进行数据库初始化以及添加测试数据。
创建数据库的文件编码为UTF-8.
2、MySQL设置
根据很多大虾的指南,我在/etc/mysql/my.cnf中分别加了如下内容:
[client]
default-character-set=gbk
[mysqld]
default-character-set=gbk
使用mysql客户端登录,查看:
mysql> show variables like ''character_set'';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| character_set | gbk |
+---------------+-------+
说明数据库的默认编码已经成功的改为了gbk.
问题:
当我使用php连接mysql的时候,使用utf-8的编码可以正常显示中文。但是当我在JDBC中使用utf-8不可以。
包括设置response.setCharacterEncoding("UTF-8");同样没有效果。
实验:
1、通过终端将终端编码查询。显示中文为乱码。将终端编码转为utf-8,查询正常显示中文。
2、我使用jdbc添加一条中文信息到数据库中,通过php查看,显示为乱码,当我将编码调为gbk时正常。
这时间我想,我通过文件添加到数据库中的数据可能并非GBK编码,而是使用了UTF-8.
解决:
在URL参数上加上:useUnicode=true&characterEncoding=utf8,
查询正常显示。
结论:虽然数据库默认编码为gbk,但是数据存储却使用了utf-8格式,这时如果不指明数据使用的为utf8格式,则JDBC会通过查看character_set而自动进行一个从GBK->UTF-8的编码转换,这个转换是多余的。因而出错。
至于为什么设置默认编码为gbk而存到数据库中依然为utf-8,我依然没有弄明白。