1、改客戶端字符集:通過WINDOWS的運行菜單運行Regedit,修改注冊表
成都創(chuàng)新互聯(lián)是專業(yè)的駐馬店網(wǎng)站建設(shè)公司,駐馬店接單;提供成都做網(wǎng)站、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行駐馬店網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
Start - Run - Rededit -|
Under registry Editor - HKEY_LOCAL_MACHINE - SOFTWARE -Oracle-KEY_XE-RIGHT WINDOW DOUBLE CLICK NLS_LANG - CHANGE VALUE TO "AMERICAN_AMERICA.UTF8" -OK -CLOSE REGISTRY
正確設(shè)置ORACLE客戶端字符集的方法:
oracle客戶端字符集設(shè)置需要和服務(wù)器端一致,否則會出現(xiàn)亂碼問題。
首先連接服務(wù)器,查詢服務(wù)器端設(shè)置:
select * from v$nls_parameters;
找到:
NLS_LANGUAGE
NLS_TERRITORY
NLS_CHARACTERSET
環(huán)境變量nls_lang便是由這三部分組成
NLS_LANG = language_territory.charset
比如:
NLS_LANG = American_Japan.JA16SJIS
2、改服務(wù)器端字符集,通過ORACLE的SQL PLUS命令窗口改
在SQL*PLUS 中,以DBA登錄
conn 用戶名 as sysdba
然后執(zhí)行以下命令
shutdown immediate; (把database停了)
startup mount; (把database重開去可更改情況)
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
alter database open;
alter database character set utf8;
OR
alter database character set internal_use utf8;(這條命令是強(qiáng)制轉(zhuǎn)換編碼格式,有可能會導(dǎo)致數(shù)據(jù)庫中的中文變成亂碼)
shutdown immediate;
startup; (重開正常oracle)
ORACLE數(shù)據(jù)庫字符集修改完成
首先查看數(shù)據(jù)庫編碼:
select?*?from?nls_database_parameters?where?parameter?='NLS_CHARACTERSET';
這個編碼是否和你java的編碼一致,如果不一致,建議先嘗試修改java的編碼,如果java編碼不能改變,而且你有修改oracle碼制的權(quán)限,并且可以修改(慎用?。?/p>
例如目前數(shù)據(jù)庫環(huán)境的字符集是AL32UTF8,那么把它改成ZHS16GBK
1.首先以sysdba的身份登錄上去 conn /as sysdba
2.關(guān)閉數(shù)據(jù)庫shutdown immediate;
3.以mount打來數(shù)據(jù)庫,startup mount
4.設(shè)置session
SQLALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL ALTER SYSTEM SET AQ_TM_PROCESSES=0;
5.啟動數(shù)據(jù)庫
alter database open;
6.修改字符集
ALTER DATABASE CHARACTER SET ZHS16GBK;
這會可能會報錯,提示我們的字符集:新字符集必須為舊字符集的超集,這時我們可以跳過超集的檢查做更改:
ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
這條語句就可以了,TERNAL_USE提供的幫助就會使oracle繞過了子集與超集的驗證,這條語句和上面的語句內(nèi)部操作時完全相同的。
7.關(guān)閉,重新啟動
SQLshutdown immediate;
SQL startup
當(dāng)然字符集最好不要輕易修改,因為這會對數(shù)據(jù)庫的數(shù)據(jù)有直接的影響,如果是生產(chǎn)環(huán)境的話,可能會造成不可估計得損失。
1、首先,Oracle查詢編碼:select * from v$nls_parameters;//看看是否GBK
2、如果是用Servlet或者別的,插入數(shù)據(jù)之前輸出一下,看看是否亂碼。
比如:
doPost()
//設(shè)置接受編碼,但你的頁面也必須是UTF-8
response.setContentType("text/html;charset=UTF-8");
doGet()
//下面方式轉(zhuǎn)一下碼
String username = new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
如何更改Oracle字符集
國內(nèi)最常用的Oracle字符集ZHS16GBK(GBK 16-bit Simplified Chinese)能夠支持繁體中文,并且按照2個字符長度存儲一個漢字。UTF8字符集是多字節(jié)存儲,1個漢字(簡體、繁體)有時采用3個字符長度存儲。
Oracle支持字符集的更改,但是UTF8是Oracle中最大的字符集,也就是說UTF8是ZHS16GBK的嚴(yán)格超集。
對于子集到超集的轉(zhuǎn)換,Oracle是允許的,但是對于超集到子集的轉(zhuǎn)換是不允許的。一般對于超集到子集的轉(zhuǎn)換,建議是通過dbca刪除原來的數(shù)據(jù)庫,重新再建庫,選擇正確的字符集,然后導(dǎo)入備份。
我的方案是:先備份數(shù)據(jù),然后強(qiáng)制轉(zhuǎn)換字符集從UTF8到ZHS16GBK,然后導(dǎo)入備份數(shù)據(jù)。如果不行,才來重新建庫,設(shè)置字符集ZHS16GBK,導(dǎo)入備份數(shù)據(jù)。如果這還不行,就把更改字符集從ZHS16GBK到UTF8(這是安全的),再導(dǎo)入備份數(shù)據(jù),恢復(fù)到原始狀況。這樣就有可能避開重新建庫的麻煩。
1. 備份數(shù)據(jù)庫中所有用戶的數(shù)據(jù)
以oracle用戶登陸,執(zhí)行以下命令
# export NLS_LANG = “SIMPLIFIED CHINESE_CHINA.UTF8”
保持與數(shù)據(jù)庫服務(wù)器端一致,這樣在exp導(dǎo)出時,就不會存在字符的轉(zhuǎn)換了,備份最原始的數(shù)據(jù)。
2. 評估UTF8轉(zhuǎn)換成ZHS16GBK的風(fēng)險
轉(zhuǎn)換之前,要使用Oracle的csscan工具對數(shù)據(jù)庫掃描,評估字符集轉(zhuǎn)換前后,數(shù)據(jù)有可能的損壞情況。如果評估情況糟糕,那就絕對要放棄了。
先安裝屬于 CSMIG 用戶的一套表和過程。以oracle用戶登陸UNIX,
#sqlplus “/ as sysdab”
SQL@$ORACLE_HOME/ rdbms/admin/csminst.sql
SQLexit
# $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”的情況,因此可以更放心一點。
3. 更改數(shù)據(jù)庫的字符集為ZHS16GBK
前面說過,通過命令“Alter Database Characeter Set XXXX”,實現(xiàn)從超集到子集的轉(zhuǎn)換,在Oracle是不允許的。但是該命令,提供這樣的命令方式:
Alter Database Character Set INTERNAL_CONVERT/ INTERNAL_USE XXXX
這是Oracle的非公開命令。“在使用這個命令時,Oracle會跳過所有子集及超集的檢查,在任意字符集之間進(jìn)行強(qiáng)制轉(zhuǎn)換,所以,使用這個命令時你必須十分小心,你必須清楚這一操作會帶來的風(fēng)險”。
以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 value$ from props$ where name=’NLS_CHARACTERSET’;
VALUE$
-----------------
ZHS16GBK
緊接著檢查一下數(shù)據(jù)庫中簡體中文、繁體中文是否正常,不會出現(xiàn)亂碼。
SQLselect spid,spname,spshortname from spinfovisual_hk
…...
非常不幸,我看到了一堆亂碼,這也證明了Oracle不支持字符集從超集到子集的更改,當(dāng)時心里很緊張,很怕失敗,從而恢復(fù)到原樣。
但是根據(jù)以前的驗證,把UTF8下的備份導(dǎo)入到ZHS16GBK中去,是OK的,所以繼續(xù)嘗試。
4. 導(dǎo)入備份的用戶數(shù)據(jù)
還是以oracle用戶登陸UNIX, 先刪除庫中的用戶mmsc:
#sqlplus “/ as sysdba”
SQLdrop user mmsc cascade;
SQLexit
再運行createuser.sql,生成mmsc用戶。
然后使用原來的備份文件,導(dǎo)入到mmsc用戶中:
注意:先設(shè)置NLS_LANG要與當(dāng)前數(shù)據(jù)庫的一致:ZHS16GBK。這樣,導(dǎo)出時用戶會話的NLS_LANG為UTF8,與原先的數(shù)據(jù)庫字符集一致;現(xiàn)在為ZHS16GBK,與此時的數(shù)據(jù)庫字符集一致。這樣,導(dǎo)入時,就會進(jìn)行字符轉(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ù)庫中簡體、繁體中文,哈哈,沒有亂碼了,一切顯示正常。
緊接著進(jìn)行驗證,也證明了:1個漢字此時只占用2個字符長度。問題解決了!
1、首先需要進(jìn)入oracle,所以無需再次進(jìn)行驗證。
2、只好到my.ini文件查看,default-character-set=utf8(默認(rèn)編碼設(shè)置,一般應(yīng)與操作系統(tǒng)編碼一致)(修改成default-character-set=gbk)(gb18030不行)character-set-server=utf8(服務(wù)端編碼設(shè)置)(默認(rèn)不需要改,但如果不是utf8,建議改成utf8)。
3、然后再次進(jìn)入命令行模式,執(zhí)行查詢即可。