还有一种方法是,再使java从MySQL中取出数据时让其由"latin1"转化为"gbk",从java向MySQL中插入数据时让其由"gbk"转化为"latin1",以取出数据为例,经过这样的转化:
String name=new String(rst.getString("name").getBytes("ISO-8859-1"),"GBK");
这里注意:gbk在java中是大写,小写会出错。latin1在java中对应的是ISO-8859-1.
也可以写两个转化函数,在转化时通过调用函数去转化,这两个函数如下:
import java.io.UnsupportedEncodingException;
//解决中文问题
public class EncodingUtil {
//从数据库取出用
public static String latin1ToGBK(String str)
{
try {
String temp_p = str;
byte[] temp_t = temp_p.getBytes("ISO-8859-1");
String temp = new String(temp_t,"GBK");
return temp;
}catch (UnsupportedEncodingException ex) {
System.out.println(ex);
return "";
}
}
//存入中文数据时用
public static String GBKToLatin1(String str)
{
if(str==null)
{
str="";
}
else{
try{
str=new String(str.getBytes("GBK"),"ISO-8859-1");
}
catch(Exception ex){
ex.printStackTrace();
}
}
return str;
}
}
但这种用于较少的数据库操作的话还行,若你要频繁的从数据库中存取数据,那么每一句存取的语句你都去调用方法去转化,那显然是行不通的。
写到这里,我再多说一点,我自己的理解对于后两种方法,应该是在早期驱动程序不完善的时候出现问题的解决方法,可能驱动程序中对两种编码的转化没有能很好的实现,从而导致的存取乱码问题,我在网上就见过有人通过修改mysql-jdbc驱动去解决问题,因为mysql-jdbc驱动是开放源码的,他通过修改程序,重新编译生成class文件,然后运行不出现任何问题,很牛的人。
我自己的理解认为:现在的驱动已经完善了,所以在存取数据库时,不会出现乱码问题,乱码问题只是数据库使用的编码方式若不是中文的,那么在向其插入中文数据时,它不能正确显示出来,我们只需修改数据库的编码方式即可OK了。
还有注意:不同版本的MySQL会有不同的结果,这个很奇怪,网上有人说MySQL数据库的东西都是二进制存放的,支持任何数据,当然包括中文,你在MySQL命令行下输入:
insert into stu values(4,'李四','boy');
select * from stu;
会正确显示李四,而如果你在java中向其插入该条记录,再在MySQL中查看,就成??了,他的意思是证明了乱码出现的原因是在java与MySQL的连接部分,也即驱动不能正确转化。我在mysql-5.0.51a-win32中这样测试过,确实是这样的,但你在我们现在用的mysql-5.0.41-win32_178中测试,若MySQL编码为latin1时,在MySQL命令中插入中文记录时,会出现错误:ERROR:1366(HY000)Incorrect string value: .....
也即在mysql-5.0.41-win32_178中,若编码为latin1时,它不让我们直接插入中文数据,但不知为何在mysql-5.0.51a-win32却可以,这是个疑问,有知人士可以给出解答,在这先谢了。