OCI JDBC驱动程序和NLS设置

时间:2011-11-02 16:06:26

标签: jdbc oci nls

我们创建了一个“登录后”触发器来更改会话以设置两个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设置与数据库服务器上的NLS设置同步?

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

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

2 个答案:

答案 0 :(得分:2)

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

  1. “NLS_LANGUAGE和NLS_TERRITORY设置的目的是让数据库知道语言环境信息。这些信息来自客户端上的NLS_LANG设置(但也可以更改)。这些设置允许数据库将数据发送回客户端的预期格式和语言。“ - 取自here
  2. 不,它不能配置为避免执行,尽管它可能是未来的功能。事实上,似乎唯一的解决方案是让您的应用程序在登录后始终更改这些参数。
  3. 如果您使用的是瘦连接器而不是OCI驱动程序,并且设置了登录触发器,则可能会有所帮助,这些值将在登录后正确设置。这里的问题是OCI驱动程序只有在执行登录触发器后才会根据NLS_LANG设置这些值。

答案 1 :(得分:0)

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

  

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

您观察到的

ALTER SESSION语句可能来自 Oracle全球化支持指南 9全局环境中的Java编程章节Globalization Support for JDBC Drivers中的以下语句(第2版(9.2))

  

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