在使用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); } } |