我正在使用Windows操作系统,我知道此设置存储在注册表中。问题是注册表路径从版本变为版本,虽然浏览那一堆注册表项肯定不是一个好主意。
我可以使用NLS_LANG
获取服务器的SELECT USERENV ('language') FROM DUAL
。
我想将它与客户端设置进行比较,并在它们不匹配时显示警告,就像Pl / Sql Developer一样。
答案 0 :(得分:7)
这是我解决编码问题时的工作。 (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)
答案 1 :(得分:1)
我不确定这是否每次都有效,但对于我来说,在sql * plus:
variable n varchar2(200)
execute sys.dbms_system.get_env('NLS_LANG', :n )
print n
AMERICAN_AMERICA.WE8ISO8859P1
只需构建一个函数包装器,将执行权授予需要它的用户,然后就可以了。
答案 2 :(得分:1)
根据Jocke的回答(感谢Jocke),我测试了以下查询:
SELECT DISTINCT client_charset FROM v$session_connect_info
WHERE sid = sys_context('USERENV','SID');
这完全可以完成工作,但是我不确定是否有任何用户将拥有必要的权限。