我正在使用Windows操作系统,我知道这个设置存储在注册表中。问题在于注册表路径从版本到版本发生了变化,浏览这些注册表项并不是一个好主意。如何检查客户端的NLS_LANG?
我可以通过SELECT USERENV ('language') FROM DUAL
获得服务器的NLS_LANG
。
我想将它与客户端设置进行比较,并在它们不匹配时显示警告,就像Pl/Sql Developer一样。
我正在使用Windows操作系统,我知道这个设置存储在注册表中。问题在于注册表路径从版本到版本发生了变化,浏览这些注册表项并不是一个好主意。如何检查客户端的NLS_LANG?
我可以通过SELECT USERENV ('language') FROM DUAL
获得服务器的NLS_LANG
。
我想将它与客户端设置进行比较,并在它们不匹配时显示警告,就像Pl/Sql Developer一样。
这是我在解决编码问题时所要做的。 (由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)
谢谢,这是一种解决方法。不幸的是,我不能那样做。我想要的只是进行快速检查。在HD中进行全面搜索会带来答案,但它需要很长时间(并且,它不是*可靠,可能有其他文件具有该名称)。所以,如果我理解正确,就没有简单的方法。我*有*浏览,虽然疯狂的注册表键,每改变一次新版本。是对的吗?在那种情况下,我想我会放弃它。这不值得付出努力。 – 2012-07-17 19:47:22
我不知道,如果这个工程每一次,但对我在SQL * Plus:
变量n VARCHAR2(200)
执行sys.dbms_system.get_env( 'NLS_LANG', :N)
打印ñ
AMERICAN_AMERICA.WE8ISO8859P1
只需构建一个函数包装器,将执行授予需要它的用户,然后就可以继续。
你看过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
那么,他们给我的一切...除了客户端的NLS_LANG – 2012-07-17 13:10:48
会话视图不会给你想要的? 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