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