2012-07-17 50 views
10

我正在使用Windows操作系统,我知道这个设置存储在注册表中。问题在于注册表路径从版本到版本发生了变化,浏览这些注册表项并不是一个好主意。如何检查客户端的NLS_LANG?

我可以通过SELECT USERENV ('language') FROM DUAL获得服务器的NLS_LANG

我想将它与客户端设置进行比较,并在它们不匹配时显示警告,就像Pl/Sql Developer一样。

+0

你看过NLS_SESSION_PARAMETERS,NLS_DATABASE_PARAMETERS和NLS_INSTANCE_PARAMETERS吗? http://docs.oracle.com/cd/E11882_01/server.112/e25513.pdf – Glenn 2012-07-17 13:02:48

+2

那么,他们给我的一切...除了客户端的NLS_LANG – 2012-07-17 13:10:48

+2

会话视图不会给你想要的? select * from nls_session_parameters where parameter ='NLS_LANGUAGE'; alter session set nls_language = german; select * from nls_session_parameters where parameter ='NLS_LANGUAGE'; – Glenn 2012-07-17 13:22:48

回答

6

这是我在解决编码问题时所要做的。 (由sqlplus中读取的NLS_LANG值):

SQL>/* It's a hack. I don't know why it works. But it does!*/ 
SQL>@[%NLS_LANG%] 
SP2-0310: unable to open file "[NORWEGIAN_NORWAY.WE8MSWIN1252]" 

必须从注册表中提取当前ORACLE_HOME的NLS_LANG值。 所有客户端工具(sqlplus,sqlldr,exp,imp,oci等)都从注册表 中读取此值,并确定是否应该进行任何字符转码。

ORACLE_HOME和注册表部分:

C:\>dir /s/b oracle.key 
C:\Oracle10\BIN\oracle.key 

C:\>type C:\Oracle10\BIN\oracle.key 
SOFTWARE\ORACLE\KEY_OraClient10204_Home 

在这样的我转IPython的时间来证明一个想法:

一对夫妇的查找和你在那里!

In [36]: OHOMES_INSTALLED = !where oci.dll 

In [37]: OHOMES_INSTALLED 
Out[37]: 
['C:\\Oracle10\\BIN\\oci.dll', 
'C:\\oraclexe\\app\\oracle\\product\\11.2.0\\server\\bin\\oci.dll'] 

In [38]: ORACLE_HOME = os.path.dirname(OHOMES_INSTALLED[0]) 

In [39]: ORACLE_HOME 
Out[39]: 'C:\\Oracle10\\BIN' 

In [40]: f = open(os.path.join(ORACLE_HOME, "oracle.key")) 

In [41]: SECTION = f.read() 

In [42]: SECTION 
Out[42]: 'SOFTWARE\\ORACLE\\KEY_OraClient10204_Home\n' 

In [43]: from _winreg import * 

In [44]: aReg = ConnectRegistry(None,HKEY_LOCAL_MACHINE) 

In [46]: aKey = OpenKey(aReg,SECTION.strip()) 

In [47]: val = QueryValueEx(aKey, "NLS_LANG") 

In [48]: print val 
(u'NORWEGIAN_NORWAY.WE8MSWIN1252', 1) 
+0

谢谢,这是一种解决方法。不幸的是,我不能那样做。我想要的只是进行快速检查。在HD中进行全面搜索会带来答案,但它需要很长时间(并且,它不是*可靠,可能有其他文件具有该名称)。所以,如果我理解正确,就没有简单的方法。我*有*浏览,虽然疯狂的注册表键,每改变一次新版本。是对的吗?在那种情况下,我想我会放弃它。这不值得付出努力。 – 2012-07-17 19:47:22

0

我不知道,如果这个工程每一次,但对我在SQL * Plus:

变量n VARCHAR2(200)

执行sys.dbms_system.get_env( 'NLS_LANG', :N)

打印ñ

AMERICAN_AMERICA.WE8ISO8859P1

只需构建一个函数包装器,将执行授予需要它的用户,然后就可以继续。

+0

经过一番测试。 GET_ENV不从客户端获取参数,而是从服务器进程获取参数。所以它不能按我所希望的那样工作。对不起:-( – Jocke 2018-01-19 15:44:03

+0

经过一番挖掘,我发现数据库实际上存储每个连接会话的客户端字符集: SELECT sid,client_charset FROM v $ session_connect_info; – Jocke 2018-01-23 09:24:15

相关问题