java(jsp)使用MySql数据库,中文乱码的完整解决方案

时间:2022-12-13 06:44:33

 java(jsp)使用MySql数据库,中文乱码的完整解决方案

mysql是一个小型的开源的数据库,用来自学一些技术是十分方便的。但使用mysql存储数据,也会遇到一些非常恶心的问题,如:中文乱码问题、java驱动程序无法使用的问题(已经解决,详见:http://hi.baidu.com/lauo1988/blog/item/ff0da655bd3e2eceb745ae0b.html)。

对于中文乱码问题。网上搜索得到的解决方案比较多,主要还是设置mySql的配置文件。这些都比较麻烦,但是设置成功的话,的确能够一劳永逸。但我尝试了很多次网上的方法,都不能很好的解决这个问题。乱码依然存在。想想,要做网站的话,用mySql数据库存放数据,中文都不能很好支持的话,做这东西是没有用的!

最终,我按照:将中文字字符串,按照无损编码的方式,对其进行编码,然后直接存于数据库中。当要取出数据时,再将中文字符串解码。这样可以达到存储中文字符串,又不会产生乱码的目标。

我在网上找到了一些无损编码的方式,详见:http://www.cnblogs.com/qiren5761/articles/523790.html

我采用了里面的:“StringGBKByteArrayISO-8859-1StringISO-8859-1ByteArrayGBKString ”的编码/解码方式。

主要的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数据库,产生中文乱码的完整解决方案已经呈现在你的面前。