3

我们创建了一个“登录后”触发器来更改会话,以设置两个 NLS 设置 - NLS_SORT 和 NLS_COMP。NLS_SORT 需要设置为 BINARY_CI,NLS_COMP 需要设置为 LINGUISTIC。通过在建立连接后查询 V$NLS_PARAMETERS 视图来验证值,我看到 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 客户端)设置覆盖数据库服务器设置是没有意义的。

4

2 回答 2

3

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

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

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

于 2011-11-14T12:23:49.873 回答
0

根据第19 章 Globalization Support from Home / Database / Oracle Database Online Documentation 12c Release 1 (12.1) / Application Development / Database JDBC Developer's Guide

从 Oracle 数据库 10g 开始,NLS_LANG 变量不再是 JDBC 全球化机制的一部分。JDBC 驱动程序不检查 NLS 环境。所以,设置它没有效果。

ALTER SESSION您观察到的语句可能来自Oracle9i数据库全球化支持指南(第 2 版(9.2))第 9章全局环境中的 Java 编程对 JDBC 驱动程序的全球化支持部分的以下语句:

在数据库连接时,JDBC 类库将服务器 NLS_LANGUAGE 和 NLS_TERRITORY 参数设置为对应于运行 JDBC 驱动程序的 Java VM 的语言环境。此操作仅在 JDBC OCI 和 JDBC 瘦驱动程序上执行,并确保服务器和 Java 客户端使用相同的语言进行通信。

于 2017-02-17T13:00:51.557 回答