【问题标题】:setString doesn't support national characters in PreparedStatement(Oracle 12)setString 不支持 PreparedStatement (Oracle 12) 中的国家字符
【发布时间】:2019-07-07 06:17:52
【问题描述】:

我们使用 Oracle 版本 12.1.0.2.0 和 ojdbc7-1.0.jar 和 JDK 8。

我们使用 Hikari 作为连接池,如果它是相关的并且它正在使用 oracle.jdbc.driver.OracleDriver

这是在 oracle 中使用的recommended driver

Oracle 数据库版本 JDBC 规范合规性

12.1 或 12cR1 ojdbc7.jar 与 JDK 7 和 JDK 8

在Spring应用中,我们使用PreparedStatement,我们希望支持国家字符作为字符。

我们使用setNString,它适用于新的/更新的查询

将指定参数设置为给定的 String 对象。驱动程序在将其发送到数据库时将其转换为 SQL NCHAR 或 NVARCHAR 或 LONGNVARCHAR 值(取决于参数的大小相对于驱动程序对 NVARCHAR 值的限制)。

我们能否在不更改代码的情况下使用setString现有代码添加支持(平台/配置级别)?

try (PreparedStatement ps = conn.prepareStatement(SQL_STATEMENT)) {
        ps.setString(1, THAI_TEXT);
}

目前setString 不处理国家字符(另存为?)虽然列定义为NVARCHAR2(50)

我们必须用setNString替换所有setString吗?

或者是否有可以使用setString添加国家支持的标志/属性/升级/修复?

【问题讨论】:

  • 哪个数据库和驱动程序?你真的测试过吗?假设列已正确定义,我希望大多数驱动程序能够透明地处理此问题。
  • @MarkRotteveel 我们正在使用带有 ojdbc7.jar 的 Oracle 12。目前它只适用于setNString
  • @MarkRotteveel 在使用驱动程序oracle.jdbc.driver.OracleDriver 而不是oracle.jdbc.OracleDriver 时可能会出现问题?
  • 您应该使用oracle.jdbc.OracleDriver,但它不应该有所作为。此外,ojdbc7.jar 不是驱动程序的版本,它只是指定它针对的 Java 版本(Java 7)。

标签: java spring internationalization prepared-statement oracle12c


【解决方案1】:

您可能会使用oracle.jdbc.defaultNChar=true,请参阅JDBC Guide 中的 19.2(但我发现 Oracle 和 JDBC API 在这方面非常混乱,它应该与 setString 一起使用)

【讨论】:

  • 感谢您的回答,实际上我们之前尝试在连接级别添加 defaultNChar 似乎会影响性能(较慢),您能对此发表评论吗?
  • @user7294900 我想我们也看到了字符集转换的一些开销。如果您在数据库方面没有遇到瓶颈,那么它对贝宁来说是一个很好的位置,)
  • 在您的链接中找到注释如果您将 defaultNChar 的值设置为 true,然后访问 CHAR 列,那么数据库会将所有 CHAR 数据隐式转换为 NCHAR。这种转换会对性能产生重大影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多