jdbc - OCI JDBC 驱动程序和 NLS 设置

标签 jdbc oracle-call-interface nls

我们创建了一个“登录后”触发器来更改 session ,以便设置两个 NLS 设置 - NLS_SORT 和 NLS_COMP。 NLS_SORT 需要设置为 BINARY_CI,NLS_COMP 需要设置为 LINGUISTIC。通过在建立连接后查询 V$NLS_PARAMETERS View 来验证值,我看到 NLS_COMP 参数得到更新,但 NLS_SORT 没有。

经过更多研究,我意识到 OCI JDBC 驱动程序在连接建立后执行以下查询

        ALTER SESSION SET NLS_LANGUAGE='AMERICAN' NLS_TERRITORY='AMERICA'

由于 NLS_SORT 从 NLS_LANGUAGE 派生其值,因此 NLS_SORT 参数值重置为 BINARY 而不是 BINARY_CI。 NLS_LANGUAGE 设置取自 Windows 注册表。

  1. oci jdbc 驱动程序是否执行这些查询以将客户端上的 NLS 设置与数据库服务器上的设置同步?

  2. 是否可以配置 jdbc oci 驱动程序以避免执行 alter session set NLS_LANGUAGE 查询?

我问第二个问题的原因是应用服务器(例如 glassfish、tomcat、jboss)机器(安装了 OCI 客户端)设置覆盖数据库服务器设置没有意义。

最佳答案

在为设置这些值引入登录触发器后,我一直在努力解决完全相同的问题。

  1. “NLS_LANGUAGE 和 NLS_TERRITORY 设置的目的是让数据库知道区域设置信息。这些来自客户端上的 NLS_LANG 设置(但也可以更改)。这些设置允许数据库将数据发送回客户以预期的格式和语言。” - 取自 here
  2. 不,它不能配置为避免执行,尽管它可能是 future 的功能。事实上,唯一的解决方案似乎是让您的应用程序在登录后始终更改这些参数。

如果您使用瘦连接器而不是 OCI 驱动程序并且您设置了登录触发器,那么了解这些值将在登录后正确设置可能会有所帮助。这里的问题在于 OCI 驱动程序仅在执行登录触发器后才会根据 NLS_LANG 设置这些值。

关于jdbc - OCI JDBC 驱动程序和 NLS 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7983532/

相关文章:

database - 连接池 什么是 removeAbandoned?

无法针对 OCILIB 进行编译

r - 具有五个参数的非线性模型 (w/nls R)

elasticsearch - 在Logstash中过滤jdbc数据

java.sql.SQLException : No suitable driver found for jdbc:microsoft:sqlserver

java - 在不同数据库之间复制数据(都支持jdbc)

c++ - 将 oracle oci.dll 与 mingw w64 64 位编译器一起使用

mysql - 使用 OCI、MySQL 和 LabView 构建 DLL 一直失败

r - 有没有办法在一张图上绘制具有不同衰减常数的指数衰减曲线?

r - 如何从 nls 计算 95% 的预测区间