JDBC中文字符问题根本解决方法。

发布者:罗堃,发布时间:2009-3-25 下午9:42   [ 更新时间:2009-3-27 上午12:22 ]
在使用JDBC处理Oracle中文的时候,会有很多复杂的问题。为了不出现乱码,总是需要转码。这种转换在换了个Oracle数据库字符集后,很可能又出现其他的问题。只有通过Oracle JDBC的本地化字段才可以彻底解决这些问题。以下的方法至少适合于MySQL、MSSQLServer和Oracle。
 
需要的数据包:
import oracle.sql.*;
import oracle.jdbc.*;
提取数据的处理:
  //Check jdbc type.
  if(JDBCType.isOracle(getJDBCType()))
  {
   //Get value.
   CHAR value = ((OracleResultSet)resultSet).getCHAR("subject");
   //Get content.
   request.subject = value != null ? value.stringValue() : null;
  }
  //Get bytes.
  else request.subject = CharsetConverter.convert(resultSet.getBytes("subject"),getCharset());
插入数据的处理:
  //Check jdbc type.
  if(JDBCType.isOracle(getJDBCType()))
  {
   //Create char.
   CHAR value = new CHAR(request.subject,OracleCharacterSet.getCharacterSet(getCharset()));
   //Set content.
   ((OraclePreparedStatement)insertStatement).setCHAR(11,value);
  }
  //Set subject.
  else insertStatement.setBytes(11,CharsetConverter.convert(request.subject,getCharset()));
 
字符集变换函数:
public class OracleCharacterSet
{
 /**
  * Get character set.
  *
  * @param charset Charset.
  * @return
  *     <p>Character set of oracle.</p>
  */
 public static CharacterSet getCharacterSet(String charset)
 {
  //Oracle id.
  int oracleID;
  //Check result.
  if(charset == null || charset.length() <= 0) oracleID = CharacterSet.DEFAULT_CHARSET;
  else if(charset.equals("ASCII")) oracleID = CharacterSet.ASCII_CHARSET;
  else if(charset.equals("ISO_LATIN_1")) oracleID = CharacterSet.ISO_LATIN_1_CHARSET;
  else if(charset.equals("UNICODE_1")) oracleID = CharacterSet.UNICODE_1_CHARSET;
.....
  else if(charset.equals("ZHS16GBK")) oracleID = CharacterSet.ZHS16GBK_CHARSET;
  else if(charset.equals("ZHS16DBCS")) oracleID = CharacterSet.ZHS16DBCS_CHARSET;
  else if(charset.equals("ZHS32GB18030")) oracleID = CharacterSet.ZHS32GB18030;
.....
  else return null;
  //Return result.
  return CharacterSet.make(oracleID);
 }
}