我们创建了一个“登录后”触发器来更改会话以设置两个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注册表。
oci jdbc驱动程序是否执行这些查询以将客户端上的NLS设置与数据库服务器上的NLS设置同步?
是否可以配置jdbc oci驱动程序以避免执行alter session set NLS_LANGUAGE查询?
我问第二个问题的原因是,应用服务器(例如glassfish,tomcat,jboss)机器(安装了OCI客户端)设置覆盖数据库服务器设置没有意义。
答案 0 :(得分:2)
在登录时引入触发器以设置这些值后,我一直在努力解决相同的问题。
如果您使用的是瘦连接器而不是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客户端使用相同的语言进行通信。