經常會遇到一些“為什么我的查詢顯示亂碼?”或者“為什么我導入后中文變成亂碼?”的問題,如果想徹底搞懂原因,需要研究下Oracle的字符集以及他們之間的轉換的關系,還有OS字符集、NLS_LANG跟數據庫字符集的關系。簡單的總結下要搞懂的幾個要點:
1. NLS_LANG<----->數據庫:保證字符相同,存儲的2進制可變。
OS<----->NLS_LANG:存儲的2進制不變,字符可能顯示不同。
-
2. 如果NLS_LANG設置成跟數據庫字符集一樣,則通過Oracle NET傳遞數據時存儲的2進制不會發生轉換。如果不一樣,則會發生轉換。
3. NLS_LANG并不是我們以為的用來顯示給我們的字符的編碼,真正用來顯示的編碼是OS編碼,所以如果NLS_LANG跟OS編碼不一樣時,同一個2進制串可能就會由本來的‘你’顯示成‘靠’。
4. 向數據庫傳遞字符時應盡量將NLS_LANG設置成OS字符集,以保證輸入的‘我’到NLS_LANG一層不會發生字符變化,從而保證到數據庫端存儲的就是‘我’;
不過使用EXP等客戶端工具導出時,應盡量將NLS_LANG設置成數據庫字符集,以保證導出時數據原封不動,不會發生數據丟失的可能。導入時也應盡量將NLS_LANG設成導出文件的字符集,以保證將轉換移至傳輸到數據庫的一步。(EXP,IMP也可能會發生數據丟失問題,具體要看源數據庫,EXP客戶端NLS_LANG,IMP客戶端NLS_LANG,目標數據庫的字符集)
5.其實亂碼,說到底就是用于顯示字符的操作系統沒有在字符編碼中找到對應的字符導致的,也并不是只要將NLS_LANG設置成數據庫字符集就可以避免亂碼的。 本文出自:億恩科技【www.vbseamall.com】
服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]
|