【问题标题】:Save and Load UTF-8 From Oracle 10g with iBatis使用 iBatis 从 Oracle 10g 保存和加载 UTF-8
【发布时间】:2011-08-02 07:46:02
【问题描述】:

我正在制作一个需要从数据库加载和保存 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"));

尝试更改 JDBC 连接 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)

【问题讨论】:

    标签: character-encoding oracle10g ibatis


    【解决方案1】:

    正如我在问题中所说,如果在转换为 ISO-8859-1 之前将字符串重新编码为 EUC-KR(保存,反之亦然以进行检索),则可以正确存储和检索字符串。

    我修改了以下两个类:

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

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

    在这两种情况下,我将Object[] 数组(parameterscolumnValues)转换为字符串,并应用了编码转换。

    【讨论】:

      【解决方案2】:

      我有一段时间没有使用 oracle,但我有信心这是您的“侦听器当前不知道给定的 SID”错误的原因:Can I force JDBC Driver use UTF-8 Charset to encode?

      我是一名中国开发人员,所以字符编码问题几乎相同(我们这里主要使用 GBK 字符集)。据我所知,“但它将 VARCHAR2 类型的列保存为 ASCII7”意味着您的 oracle 实例是非 unicode 安装?

      在JDBC层之上强制使用string.getBytes(charset),在维护和数据可解释性方面真的很糟糕(字符串数据对DBA显示是一团糟;DBA不能使用SQL来进行任何字符串比较本专栏等)。所以我的建议是尝试联系您的 DBA 并首先让数据库使用 unicode,因为 Oracle 非常有能力处理 unicode 数据。

      【讨论】:

      • 我真的希望我可以,但这是不可能的。涉及的繁文缛节太多了。我正在尝试修改 iBatis,以便它更改结果集中任何字符串参数和项目的编码。我会在这里更新它的进展。
      猜你喜欢
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 2019-08-08
      • 2014-04-18
      相关资源
      最近更新 更多