我正在使用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