2012-07-17 108 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