Oracle NLS_LANG小結

 

Oracle NLS_LANG小結

作者: bbsoft blog 和oracle相關

簡介:這是 Oracle NLS_LANG小結的詳細頁面,介紹了和oracle,有關的知識、技巧、經驗,和一些oracle源碼等。

http://blog.csdn.net/mmllkkjj/archive/2011/01/26/6164016.aspx
 

http://welcomyou.javaeye.com/blog/371189

JA16SJISTILDE

JAPANESE_JAPAN.JA16SJISTILDE

Oracle NLS_LANG小結

關鍵字: oracle nls_lang character set 字符集 從客戶那裏拿到一個數據庫,客戶的數據庫Server的字符集是JA16SJIS,使用export的Client端的NLS_LANG是 US7ASCII。問過DBA,得到的結論是由於Client使用的字符集是Server字符集的子集,所以導出的dump文件應該無效,以前也看過一本 《循序漸進Oracle》,從那本書的說的情況看也應該是有問題的。但是自己還是試了試,報了很多錯“長度不夠”,原因是我的Oracle Instance字符集是AL32UTF8,沒辦法重新建了個JA16SJIS數據庫,Console的NLS_LANG設置爲 AMERICAN_AMERICA.US7ASCII,成功導入!表中的日文字符都沒有問題。 

很奇怪爲什麼能成功導入,做了個是試驗: 

創建了一個Test表,包含日文字符。 
導出兩次,NLS_LANG分別是AMERICAN_AMERICA.US7ASCII和AMERICAN_AMERICA.JA16SJIS, 對比兩次導出的dump文件,發現只有文件頭不一樣,其餘部分基本一致,尤其是建表和插入的數據二進制部分完全一樣。NLS_LANG的設置可能不會影響 dump文件的編碼。通過查詢Oracle網站得到這樣的一句話 

In Oracle9i the Export utility always exports user data, including Unicode data, in the character set of the database. The Import utility automatically converts the data to the character set of the target database. 

也就是說,dump文件的數據的編碼和源數據庫的相同,不管Client的NLS_LANG如何設置。如果源數據庫的字符集和目標數據庫的字符集 不一致,import時會自動轉換。當然在不一致的情況下,源數據庫的字符集一定要是目標數據庫的子集。再查了下《循序漸進Oracle》,書中關於導入 導出的例子使用的Oracle 8i,應該是作者偷懶把上一版的內容直接拿過來沒更新。 

另外再Oracle提供的關於NLS_LANG FAQ也列出了幾條對NLS_LANG誤解: 

“NLS_LANG和數據庫的字符集一樣或許是正確的,但是經常是不對的。不要認爲NLS_LANG必須和數據庫的字符集一樣,這經常是錯的。” 《循序漸進Oracle》中說NLS_LANG一樣的話可以提高性能,因爲不需要字符集的轉換。其實這樣的轉換不時發生在Server端,Client端 轉換完成後傳遞給Server端。我覺得,只要NLS_LANG是Server的字符集的子集就可以。 

“NLS_LANG的字符集設置不會更改Client端的字符集。它只是用來告訴Oracle你在Client端使用什麼字符集,你不能通過設置NLS_LANG去影響Client的字符集”。而且如果Client端的字符集和NLS_LANG不兼容,會導致數據庫亂碼。 

“如果你不在Client端設置NLS_LANG,那麼默認會使用Server的NLS_LANG設置,這是錯的。如果Oracle在安裝時沒有 設置NLS_LANG,那麼NLS_LANG不會另外再設置,而是使用默認值:AMERICAN_AMERICA.US7ASCII。語言是 AMERICAN,區域是AMERICA,字符集US7ASCII” 

“設置NLS_LANG的LANGUAGE 和 TERRITORY部分不會影響存儲在數據庫的字符。將NLS_LANG設置爲JAPANESE_JAPAN.WE8MSWIN1252不會允許你存儲日 文。因爲WE8MSWIN1252字符集不支持日文。但是設置成AMERICAN_AMERICA.JA16SJIS會允許你存儲日文,假設你輸入的字符 是JA16SJIS,並且數據庫的字符集也支持日文(如UTF8或者JA16SJIS)” 


還需要注意的是: 

SELECT USERENV ('language') FROM DUAL返回的是Session的LANGUAGE和 TERRITORY數據庫的字符集。 

參考:http://www.oracle.com/technology/tech/globalization/htdocs/nls_lang%20faq.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章