mysql是一个小型的开源的数据库,用来自学一些技术是十分方便的。但使用mysql存储数据,也会遇到一些非常恶心的问题,如:中文乱码问题、java驱动程序无法使用的问题(已经解决,详见:http://hi.baidu.com/lauo1988/blog/item/ff0da655bd3e2eceb745ae0b.html)。
对于中文乱码问题。网上搜索得到的解决方案比较多,主要还是设置mySql的配置文件。这些都比较麻烦,但是设置成功的话,的确能够一劳永逸。但我尝试了很多次网上的方法,都不能很好的解决这个问题。乱码依然存在。想想,要做网站的话,用mySql数据库存放数据,中文都不能很好支持的话,做这东西是没有用的!
最终,我按照:将中文字字符串,按照无损编码的方式,对其进行编码,然后直接存于数据库中。当要取出数据时,再将中文字符串解码。这样可以达到存储中文字符串,又不会产生乱码的目标。
我采用了里面的:“String-GBK〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-GBK〉String ”的编码/解码方式。
主要的java处理函数如下:
/*
*完成从gbk编码到ISO-8859-1的转换
*/
public static String encode(String str)
{
if(str==null||str.equals("")) return str;
try
{
return new String(str.getBytes("gbk"),"ISO-8859-1");
}
catch(Exception e){ e.printStackTrace(); return str;}
}
/*
*从ISO-8859-1恢复gbk编码
*/
public static String decode(String str)
{
if(str==null||str.equals("")) return str;
try
{
return new String(str.getBytes("ISO-8859-1"),"gbk");
}
catch(Exception e){ e.printStackTrace(); return str;}
}
当然,对于sql操作,不管是插入还是查询,sql语句必需先经过encode函数编码,然后得到的查询结果使用decode,可以恢复到需要的中文字串。举例如下:
/*
*获得用户的描述信息
*/
public String[] getUserInfo(String uid)
{
if(uid==null||uid.equals("")) return null;
try
{
uid = encode(uid);
//查询语句需要encode编码
ResultSet rev = stm.executeQuery(encode("select * from user where uid='"+uid+"'");
if(rev.next())
{
String[] str=new String[4];
str[0] = decode(rev.getString("uid"));//得到的结果需要decode解码
str[1] = decode(rev.getString("psw"));
str[2] = decode(rev.getString("role"));
str[3] = decode(rev.getString("etc"));
return str;
}
else return null;
}
catch(Exception e)
{
return null;
}
}
方法总结:
优点:无需对mySql的charset进行重新配置,只需要使用encode、decode对相应的sql语句进行编码及解码,即可实现中文字符串在mysql中的完整存储。
缺点:每一个sql语句,都需要再编码(encode);每一个包含中文字串的查询结果,都需要解码decode
jsp使用此方法进行查询及相应的操作时,应该注意网页得到的表单的数据编码为iso-8859-1,应该注意转换。使用以下方法:
user = bbsDbm.encode(user,"iso-8859-1","gb2312");//jsp网页属性为:charset=gb2312
此encode函数为:(bbsDbm:我的bbs系统数据库管理类,用以实现数据库操作,---javaBean)
public static String encode(String str,String charset1,String charset2)
{
if(str==null||str.equals("")) return str;
try
{
return new String(str.getBytes(charset1),charset2);
}
catch(Exception e){ e.printStackTrace(); return str;}
}
简单而言:注意编码、解码的无损性,保证数据库存储的是完整中文数据,从数据库提取信息,也要无损解码。对于jsp,只要正确知道,当前页面所使用的charset,以及网页表单提交的数据的默认编码,即可对其进行再解码。
至此,完整的jsp、java使用mySql数据库,产生中文乱码的完整解决方案已经呈现在你的面前。