如何检查客户端的NLS_LANG?(How do I check the NLS_LANG of t

2019-06-26 08:36发布

我工作在Windows操作系统上,我知道这个设置存储在注册表中。 问题是,注册表路径从版本更改为版本,浏览尽管这一串注册表项是definitly不是一个好主意。

我能得到NLS_LANG与服务器的SELECT USERENV ('language') FROM DUAL

我想比较,与客户端的设置,并显示在它们不匹配的警告,就像PL / SQL开发者。

Answer 1:

据Jocke的回答(感谢Jocke),我测试了以下查询:

SELECT DISTINCT client_charset FROM v$session_connect_info
WHERE sid = sys_context('USERENV','SID');

它完美地做这项工作,但我不确定,如果任何用户有必要的权限。



Answer 2:

这是我做的,当我解决编码问题。 (由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)


Answer 3:

我不知道这屡试不爽,但我在SQL * Plus:

variable n varchar2(200)

execute sys.dbms_system.get_env('NLS_LANG', :n )

print n

AMERICAN_AMERICA.WE8ISO8859P1

只需建立一个功能包装,授予执行给谁需要它的用户,你去那里。



文章来源: How do I check the NLS_LANG of the client?