Сохраните и загрузите UTF-8 из Oracle 10g с помощью iBatis - PullRequest
0 голосов
/ 02 августа 2011

Я создаю веб-приложение, которое должно загружать и сохранять символы UTF-8 (в частности, корейский) из БД.Мне дали учетную запись на сервере Oracle 10g, но она сохраняет столбцы типа VARCHAR2 как ASCII7, причем каждый символ UTF-8 занимает 2 VARCHAR2 слота.

Я предполагал, что с iBatisпишет так же, как и чтение, если я буду относиться ко всему от ввода к выводу как к UTF-8, у меня не возникнет проблем, но любые вводимые мной корейские символы получаются искаженными.

Есть ли способсделать это правильно, не испортив (чужую) базу данных?

Дополнительная информация:

Ранее я мог загружать корейские строки, используя:

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

Изаписать корейские строки в БД с помощью:

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

Попытки изменить URL-адрес соединения JDBC приводят к следующему сообщению:

Описание

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

dump dump

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)

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Как я уже говорил в этом вопросе, строки сохраняются и извлекаются правильно, если они перекодируются в EUC-KR перед преобразованием в ISO-8859-1 (для сохранения или наоборот для извлечения).

Я изменил два следующих класса:

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

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

В обоих случаях я взял массив Object[] (parameters и columnValues), преобразовал его в String и применил преобразования кодирования.

0 голосов
/ 02 августа 2011

Я давно не пользуюсь oracle, но я уверен, что это причина того, что ваша ошибка "слушатель в настоящее время не знает о заданном SID": Могу ли я заставить драйвер JDBC использовать кодировку UTF-8 дляencode?

Я китайский разработчик, поэтому проблема кодировки символов почти такая же (мы в основном используем здесь набор символов GBK).Насколько я помню, «но он сохраняет столбцы типа VARCHAR2 как ASCII7» означает, что ваш экземпляр oracle является установкой не-Unicode?

Принудительное использование string.getBytes (charset) над уровнем JDBC действительно очень плохо с точки зрения обслуживания и интерпретации данных (строковые данные отображаются как беспорядок для DBA; DBA не может использовать SQL для выполнения каких-либосравнение строк в этом столбце и т. д.).Поэтому я советую попытаться связаться с вашим администратором базы данных и сначала заставить базу данных работать с юникодом, поскольку Oracle очень способна обрабатывать данные юникода.

...