重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
1. 備份數據庫中所有用戶的數據
10多年專注成都網站制作,成都定制網頁設計,個人網站制作服務,為大家分享網站制作知識、方案,網站設計流程、步驟,成功服務上千家企業。為您提供網站建設,網站制作,網頁設計及定制高端網站建設服務,專注于成都定制網頁設計,高端網頁制作,對成都不銹鋼雕塑等多個領域,擁有豐富設計經驗。
以oracle用戶登陸,執行以下命令
# export NLS_LANG = “SIMPLIFIED CHINESE_CHINA.UTF8”
保持與數據庫服務器端一致,這樣在exp導出時,就不會存在字符的轉換了,備份最原始的數據。
2. 評估UTF8轉換成ZHS16GBK的風險
轉換之前,要使用Oracle的csscan工具對數據庫掃描,評估字符集轉換前后,數據有可能的損壞情況。如果評估情況糟糕,那就絕對要放棄了。
先安裝屬于 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中的所有數據,從字符集UTF8更改為ZHS16GBK的轉換情況。然后得到三個文件:scan.txt、scan.out、scan.err。
查看scan.out,scan.err,可以看出mmsc用戶下的所有的數據都是可以轉換的,并且沒有出現轉換“Exceptional”的情況,因此可以更放心一點。
3. 更改數據庫的字符集為ZHS16GBK
前面說過,通過命令“Alter Database Characeter Set XXXX”,實現從超集到子集的轉換,在Oracle是不允許的。但是該命令,提供這樣的命令方式:
Alter Database Character Set INTERNAL_CONVERT/ INTERNAL_USE XXXX
如何設置oracle的編碼格式
查看及修改oracle編碼格式方法:
1、查看oracle數據庫字符集:
select userenv('language') from dual;
查詢結果:
SIMPLIFIED CHINESE_CHINA.AL32UTF8
2、修改oracle數據庫字符集:(在SQL Plus中)
sql conn / as sysdba;
sql shutdown immediate;
database closed.
database dismounted.
oracle instance shut down.
sql startup mount;
oracle instance started.
total system global area 135337420 bytes
fixed size 452044 bytes
variable size 109051904 bytes
database buffers 25165824 bytes
redo buffers 667648 bytes
database mounted.
sql alter system enable restricted session;
system altered.
sql alter system set job_queue_processes=0;
system altered.
sql alter system set aq_tm_processes=0;
system altered.
啟動database configuration assistant,創建數據庫,參照下面的圖釋。
這里指定數據庫名和實例名,根據自己想要的設置,這里是舉例啦
可以統一的口令,也可以選上面的選項進行逐一設置
可以在這里設置字符集,后面的步驟默認即可。有問題再追問吧。
以下內容為固定寫法,可以修改數據庫編碼格式。
第一步:通過系統管理員權限登錄數據庫。
sql conn / as sysdba;
第二步:關閉數據庫和實例連接。
sql shutdown immediate;
database closed.
database dismounted.
oracle instance shut down.
第三步:啟動數據庫實例連接。
sql startup mount;
oracle instance started.
total system global area 135337420 bytes
fixed size 452044 bytes
variable size 109051904 bytes
database buffers 25165824 bytes
redo buffers 667648 bytes
database mounted.
第四步:限制其它用戶連接數據庫使用資源。
sql alter system enable restricted session;
system altered.
第五步:設置作業進行為0個。
sql alter system set job_queue_processes=0;
system altered.
第六步:設置啟動時間管理器的數量為0
sql alter system set aq_tm_processes=0;
system altered.
第七步:打開數據庫連接
sql alter database open;
database altered.
第八步:修改需要的編碼格式
sql alter database character set internal_use GBK;
第九步:關閉連接。
sql shutdown immediate;
第十步:啟動oracle進程。
sql startup;
備注:常用的有:UTF-8,GBK 。
UTF-8:是一種針對Unicode的可變長度字符編碼,又稱萬國碼。由Ken Thompson于1992年創建。現在已經標準化為RFC 3629。UTF-8用1到6個字節編碼UNICODE字符。用在網頁上可以同一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。
oracle設置單次編碼首先我們打開這樣的一個小程序編碼然后點開它的主頁面進行一個設置然后設置單詞編碼就可以
如何更改Oracle字符集
國內最常用的Oracle字符集ZHS16GBK(GBK 16-bit Simplified Chinese)能夠支持繁體中文,并且按照2個字符長度存儲一個漢字。UTF8字符集是多字節存儲,1個漢字(簡體、繁體)有時采用3個字符長度存儲。
Oracle支持字符集的更改,但是UTF8是Oracle中最大的字符集,也就是說UTF8是ZHS16GBK的嚴格超集。
對于子集到超集的轉換,Oracle是允許的,但是對于超集到子集的轉換是不允許的。一般對于超集到子集的轉換,建議是通過dbca刪除原來的數據庫,重新再建庫,選擇正確的字符集,然后導入備份。
我的方案是:先備份數據,然后強制轉換字符集從UTF8到ZHS16GBK,然后導入備份數據。如果不行,才來重新建庫,設置字符集ZHS16GBK,導入備份數據。如果這還不行,就把更改字符集從ZHS16GBK到UTF8(這是安全的),再導入備份數據,恢復到原始狀況。這樣就有可能避開重新建庫的麻煩。
1. 備份數據庫中所有用戶的數據
以oracle用戶登陸,執行以下命令
# export NLS_LANG = “SIMPLIFIED CHINESE_CHINA.UTF8”
保持與數據庫服務器端一致,這樣在exp導出時,就不會存在字符的轉換了,備份最原始的數據。
2. 評估UTF8轉換成ZHS16GBK的風險
轉換之前,要使用Oracle的csscan工具對數據庫掃描,評估字符集轉換前后,數據有可能的損壞情況。如果評估情況糟糕,那就絕對要放棄了。
先安裝屬于 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中的所有數據,從字符集UTF8更改為ZHS16GBK的轉換情況。然后得到三個文件:scan.txt、scan.out、scan.err。
查看scan.out,scan.err,可以看出mmsc用戶下的所有的數據都是可以轉換的,并且沒有出現轉換“Exceptional”的情況,因此可以更放心一點。
3. 更改數據庫的字符集為ZHS16GBK
前面說過,通過命令“Alter Database Characeter Set XXXX”,實現從超集到子集的轉換,在Oracle是不允許的。但是該命令,提供這樣的命令方式:
Alter Database Character Set INTERNAL_CONVERT/ INTERNAL_USE XXXX
這是Oracle的非公開命令。“在使用這個命令時,Oracle會跳過所有子集及超集的檢查,在任意字符集之間進行強制轉換,所以,使用這個命令時你必須十分小心,你必須清楚這一操作會帶來的風險”。
以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”參數,系統會提示出錯:
//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;
此時,檢查一下數據庫的字符集是否更改過來
SQL select value$ from props$ where name=’NLS_CHARACTERSET’;
VALUE$
-----------------
ZHS16GBK
緊接著檢查一下數據庫中簡體中文、繁體中文是否正常,不會出現亂碼。
SQLselect spid,spname,spshortname from spinfovisual_hk
…...
非常不幸,我看到了一堆亂碼,這也證明了Oracle不支持字符集從超集到子集的更改,當時心里很緊張,很怕失敗,從而恢復到原樣。
但是根據以前的驗證,把UTF8下的備份導入到ZHS16GBK中去,是OK的,所以繼續嘗試。
4. 導入備份的用戶數據
還是以oracle用戶登陸UNIX, 先刪除庫中的用戶mmsc:
#sqlplus “/ as sysdba”
SQLdrop user mmsc cascade;
SQLexit
再運行createuser.sql,生成mmsc用戶。
然后使用原來的備份文件,導入到mmsc用戶中:
注意:先設置NLS_LANG要與當前數據庫的一致:ZHS16GBK。這樣,導出時用戶會話的NLS_LANG為UTF8,與原先的數據庫字符集一致;現在為ZHS16GBK,與此時的數據庫字符集一致。這樣,導入時,就會進行字符轉換。
# export NLS_LANG = “SIMPLIFIED CHINESE_CHINA.ZHS16GBK”
#imp mmsc/mmsc@mdspdb file=DSMPD113_user_mmsc.dmp ignore=y fromuser=mmsc touser=mmsc
馬上查看數據庫中簡體、繁體中文,哈哈,沒有亂碼了,一切顯示正常。
緊接著進行驗證,也證明了:1個漢字此時只占用2個字符長度。問題解決了!