如何更改Oracle字符集避免亂碼

轉(zhuǎn)一位大神的筆記。

國內(nèi)最常用的Oracle字符集ZHS16GBK(GBK 16-bit Simplified Chinese)能夠支持繁體中文,并且按照2個字符長度存儲一個漢字驯杜。UTF8字符集是多字節(jié)存儲旨涝,1個漢字(簡體、繁體)有時采用3個字符長度存儲凛膏。
  Oracle支持字符集的更改,但是UTF8是Oracle中最大的字符集,也就是說UTF8是ZHS16GBK的嚴格超集稠肘。
對于子集到超集的轉(zhuǎn)換,Oracle是允許的萝毛,但是對于超集到子集的轉(zhuǎn)換是不允許的项阴。一般對于超集到子集的轉(zhuǎn)換,建議是通過dbca刪除原來的數(shù)據(jù)庫笆包,重新再建庫环揽,選擇正確的字符集,然后導入備份庵佣。
  我的方案是:先備份數(shù)據(jù)歉胶,然后強制轉(zhuǎn)換字符集從UTF8到ZHS16GBK,然后導入備份數(shù)據(jù)巴粪。如果不行通今,才來重新建庫粥谬,設(shè)置字符集ZHS16GBK,導入備份數(shù)據(jù)辫塌。如果這還不行漏策,就把更改字符集從ZHS16GBK到UTF8(這是安全的),再導入備份數(shù)據(jù)臼氨,恢復到原始狀況掺喻。這樣就有可能避開重新建庫的麻煩。

  1. 備份數(shù)據(jù)庫中所有用戶的數(shù)據(jù)
      以oracle用戶登陸储矩,執(zhí)行以下命令
      # export NLS_LANG = “SIMPLIFIED CHINESE_CHINA.UTF8”
      保持與數(shù)據(jù)庫服務(wù)器端一致感耙,這樣在exp導出時,就不會存在字符的轉(zhuǎn)換了持隧,備份最原始的數(shù)據(jù)即硼。
  2. 評估UTF8轉(zhuǎn)換成ZHS16GBK的風險
      轉(zhuǎn)換之前,要使用Oracle的csscan工具對數(shù)據(jù)庫掃描舆蝴,評估字符集轉(zhuǎn)換前后谦絮,數(shù)據(jù)有可能的損壞情況。如果評估情況糟糕洁仗,那就絕對要放棄了层皱。
      先安裝屬于 CSMIG 用戶的一套表和過程。以oracle用戶登陸UNIX
 ≡省#sqlplus “/ as sysdab”
  SQL>@$ORACLE_HOME/ rdbms/admin/csminst.sql
  SQL>exit
# $ORACLE_HOME\bin\csscan -help
  可以更清楚如何使用csscan叫胖。
# $ORACLE_HOME/bin/csscan system/sunday user=mmsc FROMCHAR=UTF8 TOCHAR=ZHS16GBK ARRAY=102400 PROCESS=3 > csscan.log

以上命令意思是掃描用戶:mmsc中的所有數(shù)據(jù),從字符集UTF8更改為ZHS16GBK的轉(zhuǎn)換情況她奥。然后得到三個文件:scan.txt瓮增、scan.out、scan.err哩俭。
  查看scan.out绷跑,scan.err,可以看出mmsc用戶下的所有的數(shù)據(jù)都是可以轉(zhuǎn)換的凡资,并且沒有出現(xiàn)轉(zhuǎn)換“Exceptional”的情況砸捏,因此可以更放心一點。

  1. 更改數(shù)據(jù)庫的字符集為ZHS16GBK
      前面說過隙赁,通過命令“Alter Database Characeter Set XXXX”垦藏,實現(xiàn)從超集到子集的轉(zhuǎn)換,在Oracle是不允許的伞访。但是該命令掂骏,提供這樣的命令方式:
      Alter Database Character Set INTERNAL_CONVERT/ INTERNAL_USE XXXX

這是Oracle的非公開命令『裰溃“在使用這個命令時弟灼,Oracle會跳過所有子集及超集的檢查级解,在任意字符集之間進行強制轉(zhuǎn)換,所以袜爪,使用這個命令時你必須十分小心蠕趁,你必須清楚這一操作會帶來的風險”薛闪。
以oracle用戶登陸UNIX辛馆,

  #sqlplus “/ as sysdba”
  SQL> SHUTDOWN IMMEDIATE; 
  SQL> STARTUP MOUNT; 
  SQL> ALTER SESSION SET SQL_TRACE=TRUE;
  SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION; 
  SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; 
  SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0; 
  SQL> ALTER DATABASE OPEN; 
  SQL> ALTER DATABASE CHARACTER SET ZHS16GBK; 
``
//如果不使用“INTERNAL_USE”參數(shù),系統(tǒng)會提示出錯:

//ERROR at line 1:
//ORA-12712: new character set must be a superset of old character set
  SQL> ALTER SESSION SET SQL_TRACE=FALSE;
  SQL> SHUTDOWN IMMEDIATE;
  SQL> STARTUP;
此時豁延,檢查一下數(shù)據(jù)庫的字符集是否更改過來
  SQL> select valuefrom props where name=’NLS_CHARACTERSET’;
  VALUE$
  -----------------
  ZHS16GBK

緊接著檢查一下數(shù)據(jù)庫中簡體中文昙篙、繁體中文是否正常,不會出現(xiàn)亂碼诱咏。
  SQL>select spid,spname,spshortname from spinfovisual_hk 
…...
  非常不幸苔可,我看到了一堆亂碼,這也證明了Oracle不支持字符集從超集到子集的更改袋狞,當時心里很緊張焚辅,很怕失敗,從而恢復到原樣苟鸯。
但是根據(jù)以前的驗證同蜻,把UTF8下的備份導入到ZHS16GBK中去,是OK的早处,所以繼續(xù)嘗試湾蔓。
4. 導入備份的用戶數(shù)據(jù)
  還是以oracle用戶登陸UNIX, 先刪除庫中的用戶mmsc:

#sqlplus “/ as sysdba”
  SQL>drop user mmsc cascade;
  SQL>exit

再運行createuser.sql,生成mmsc用戶砌梆。
  然后使用原來的備份文件默责,導入到mmsc用戶中:
注意:先設(shè)置NLS_LANG要與當前數(shù)據(jù)庫的一致:ZHS16GBK。這樣咸包,導出時用戶會話的NLS_LANG為UTF8桃序,與原先的數(shù)據(jù)庫字符集一致;現(xiàn)在為ZHS16GBK烂瘫,與此時的數(shù)據(jù)庫字符集一致媒熊。這樣,導入時忱反,就會進行字符轉(zhuǎn)換泛释。

# export NLS_LANG = “SIMPLIFIED CHINESE_CHINA.ZHS16GBK”
  #imp mmsc/mmsc@mdspdb file=DSMPD113_user_mmsc.dmp ignore=y fromuser=mmsc touser=mmsc

  馬上查看數(shù)據(jù)庫中簡體、繁體中文温算,沒有亂碼怜校,一切顯示正常。
  緊接著進行驗證注竿,也證明了:1個漢字此時只占用2個字符長度茄茁。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末魂贬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子裙顽,更是在濱河造成了極大的恐慌付燥,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愈犹,死亡現(xiàn)場離奇詭異键科,居然都是意外死亡,警方通過查閱死者的電腦和手機漩怎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門勋颖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勋锤,你說我怎么就攤上這事饭玲。” “怎么了叁执?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵茄厘,是天一觀的道長。 經(jīng)常有香客問我谈宛,道長次哈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任入挣,我火速辦了婚禮亿乳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘径筏。我一直安慰自己葛假,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布滋恬。 她就那樣靜靜地躺著聊训,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恢氯。 梳的紋絲不亂的頭發(fā)上带斑,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音勋拟,去河邊找鬼勋磕。 笑死,一個胖子當著我的面吹牛敢靡,可吹牛的內(nèi)容都是我干的挂滓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼啸胧,長吁一口氣:“原來是場噩夢啊……” “哼赶站!你這毒婦竟也來了幔虏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贝椿,失蹤者是張志新(化名)和其女友劉穎想括,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烙博,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡瑟蜈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了习勤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踪栋。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡焙格,死狀恐怖图毕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眷唉,我是刑警寧澤予颤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站冬阳,受9級特大地震影響蛤虐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肝陪,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一驳庭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氯窍,春花似錦饲常、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至政供,卻和暖如春播聪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背布隔。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工离陶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衅檀。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓招刨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親术吝。 傳聞我的和親對象是個殘疾皇子计济,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359