OCI JDBC驱动程序和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设置到数据库服务器上吗?

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

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

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

    NLS_LANGUAGE和NLS_TERRITORY设置的目的是让数据库知道语言环境信息。这些是从客户机上的NLS_LANG设置派生出来的(但也可以更改)。这些设置允许数据库以预期的格式和语言将数据发送回客户端。-从这里取
  1. 不,它不能被配置为避免执行,尽管它可能是未来的功能。因此,似乎唯一的解决方案是让您的应用程序在登录后始终更改这些参数。

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

根据19全球化支持 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语句可能来自9章全球化环境中的Java编程 JDBC驱动程序的全球化支持小节来自Oracle9i数据库全球化支持指南(Release 2 (9.2)):

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

最新更新