2011-08-02 4 views
0

DBからUTF-8(韓国語)の文字をロードして保存する必要があるWebアプリケーションを作成しています。私はOracle 10gサーバーについてアカウントを与えられましたが、VARCHAR2タイプの列はASCII7と保存され、各UTF-8文字は2 VARCHAR2スロットになります。Oracle 10g with iBatisからのUTF-8の保存とロード

iBatisは読んでいるのと同じ方法で書いているので、入力から出力まですべてをUTF-8として扱っても問題はありませんが、私が入力した韓国語の文字は文字化けして出てきます。

(他人の)DBを台無しにしないでこれを正しく行う方法はありますか?

詳しい情報:

ResultSet rs = ps.executeQuery(); 
String koreanString = new String(rs.getBytes("colname"), "euc-kr"); 

をそして使用してDBへ韓国語の文字列を記述します:

私は、以前使用して韓国語の文字列をロードすることができましたJDBCを変更する

PreparedStatement ps = conn.prepareStatement(sql); 
ps.setString(1, new String(koreanString.getBytes("euc-kr"), "ISO-8859-1")); 

試み接続URLはこのメッセージになります

説明

Listener refused the connection with the following error: 
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 
The Connection descriptor used by the client was: 
[ip]:myTablespace?useUnicode=true&characterEncoding=UTF-8 

エラーダンプ

javax.servlet.ServletException: Listener refused the connection with the following error: 
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 
The Connection descriptor used by the client was: 
[ip]:myTablespace?useUnicode=true&characterEncoding=UTF-8 

at jeus.servlet.jsp2.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:859) 
at jeus.servlet.jsp2.runtime.PageContextImpl.handlePageException(PageContextImpl.java:789) 
at jeus_jspwork._jsp._500_managerAdmin_5fjsp._jspService(_500_managerAdmin_5fjsp.java:452) 
at jeus.servlet.jsp2.runtime.HttpJspBase.service(HttpJspBase.java:95) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856) 
at jeus.servlet.jsp.JspServletWrapper.executeServlet(JspServletWrapper.java:147) 
at jeus.servlet.servlets.JspServlet.execute(JspServlet.java:365) 
at jeus.servlet.engine.HttpRequestProcessor.run(HttpRequestProcessor.java:284) 

根本原因

java.sql.SQLException: Listener refused the connection with the following error: 
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 
The Connection descriptor used by the client was: 
[ip]:myTablespace?useUnicode=true&characterEncoding=UTF-8 

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261) 
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387) 
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:441) 
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165) 
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35) 
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801) 
at java.sql.DriverManager.getConnection(DriverManager.java:525) 
at java.sql.DriverManager.getConnection(DriverManager.java:171) 
at com.ibatis.common.jdbc.SimpleDataSource.popConnection(SimpleDataSource.java:580) 
at com.ibatis.common.jdbc.SimpleDataSource.getConnection(SimpleDataSource.java:222) 
at com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransaction.init(JdbcTransaction.java:48) 
at com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransaction.getConnection(JdbcTransaction.java:89) 
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForObject(MappedStatement.java:120) 
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:518) 
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:493) 
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106) 
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:82) 
at [].admRole.getCount(admRole.java:44) 
at jeus_jspwork._jsp._500_managerAdmin_5fjsp._jspService(_500_managerAdmin_5fjsp.java:145) 
at jeus.servlet.jsp2.runtime.HttpJspBase.service(HttpJspBase.java:95) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856) 
at jeus.servlet.jsp.JspServletWrapper.executeServlet(JspServletWrapper.java:147) 
at jeus.servlet.servlets.JspServlet.execute(JspServlet.java:365) 
at jeus.servlet.engine.HttpRequestProcessor.run(HttpRequestProcessor.java:284) 

答えて

1

私がこの質問で述べたように、文字列は、EUC-KRとして再エンコードされてからISO-8859-1(保存するには逆も同様)に戻すと正しく保存され、取得されます。

私は2つの以下のクラス変更:では

com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap

com.ibatis.sqlmap.engine.mapping.result.ResultMap

をどちらの場合も、Object[]配列(parameterscolumnValues)をキャストしてStringにキャストし、エンコード変換を適用しました。

0

私はかなりしばらくの間、オラクルを使用していないが、これはあなたの「リスナーの理由はないんであることを私はいくつかの自信を持っています現在与えられているSIDを知っている "エラー:Can I force JDBC Driver use UTF-8 Charset to encode?

私は中国の開発者ですので、チャーラックterのエンコーディングの問題はほぼ同じです(ここではGBK文字セットを使用しています)。私が覚えている限り、「VARCHAR2タイプの列をASCII7として保存する」とは、Oracleインスタンスが非Unicodeインストールであることを意味しますか?

JDBCレイヤー上のstring.getBytes(charset)を強制的に使用すると、保守とデータの解釈が難しくなります(文字列データはDBAへの混乱として表示されますが、DBAはSQLを使用して文字列比較この列などに)。だから私のアドバイスは、あなたのDBAに連絡して、OracleがUnicodeデータを非常に扱うことができるので、データベースをUnicodeで最初に動作させることです。

+0

私は本当にできればいいと思っていますが、それは不可能です。あまりにも多くの赤いテープが関わっている。私はiBatisを変更して、結果セットの文字列パラメータとアイテムのエンコーディングを変更しようとしています。私はその進歩についてここで更新します。 – bdares

関連する問題