修改oracle字符集

建站服務(wù)器 一 修改數(shù)據(jù)庫SERVER端字符集
數(shù)據(jù)庫字符集在創(chuàng)建后原則上不能更改。如果需要修改字符集,通常需要導(dǎo)出數(shù)據(jù)庫數(shù)據(jù),重建數(shù)據(jù)庫,再導(dǎo)入數(shù)據(jù)庫數(shù)據(jù)的方式來轉(zhuǎn)換,或通過ALTER DATABASE CHARACTER SET語句修改字符集,但創(chuàng)建數(shù)據(jù)庫后修改字符集是有限制的,只有新的字符集是當(dāng)前字符集的超集時才能修改數(shù)據(jù)庫字符集,例如UTF8是US7ASCII的超集,修改數(shù)據(jù)庫字符集可使用ALTER DATABASE CHARACTER SET UTF8。根據(jù)Oracle的官方說明,字符集的轉(zhuǎn)換是從子集到超集受支持,反之不行。如果兩種字符集之間根本沒有子集和超集的關(guān)系,那么字符集的轉(zhuǎn)換是不受oracle支持的。
對數(shù)據(jù)庫server而言,錯誤的修改字符集將會導(dǎo)致很多不可測的后果,可能會嚴(yán)重影響數(shù)據(jù)庫的正常運(yùn)行,所以在修改之前一定要確認(rèn)兩種字符集是否存在子集和超集的關(guān)系。一般來說,除非萬不得已,我們不建議修改oracle數(shù)據(jù)庫server端的字符集。
特別說明,我們最常用的兩種字符集ZHS16GBK和ZHS16CGB231280之間不存在子集和超集關(guān)系,因此理論上講這兩種字符集之間的相互轉(zhuǎn)換不受支持。
1 修改server端字符集方法
在oracle 8之前,可以用直接修改數(shù)據(jù)字典表props$來改變數(shù)據(jù)庫的字符集。但oracle8之后,至少有三張系統(tǒng)表記錄了數(shù)據(jù)庫字符集的信息,只改props$表并不完全,可能引起嚴(yán)重的后果。正確的修改方法如下:
$sqlplus /nolog
SQL>conn / as sysdba;
若此時數(shù)據(jù)庫服務(wù)器已啟動,則先執(zhí)行SHUTDOWN IMMEDIATE命令關(guān)閉數(shù)據(jù)庫服務(wù)器,然后執(zhí)行以下命令:
SQL>STARTUP MOUNT;
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;
SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP

2 修改server端字符集方法(可以跳過超集的檢查)
使用INTERNAL_USE可以跳過超集的檢查,ALTER DATABASE character set INTERNAL_USE 加這個以后,就可以徹底解決修改的問題,即使報錯也能修改.如:
ALTER DATABASE character set INTERNAL_USE ZHS16CGB231280;
ALTER DATABASE character set INTERNAL_USE zhs16gbk;

SQL> connect sys/oracle as sysdba
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> set linesize 120;
SQL> alter database character set ZHS16GBK;
報錯:
alter database character set zhs16gbk
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set

# 使用INTERNAL_USE可以跳過超集的檢查,ALTER DATABASE character set INTERNAL_USE
SQL> ALTER DATABASE character set INTERNAL_USE zhs16gbk;
SQL> shutdown immediate;
SQL> STARTUP
SQL> select name,value$ from props$ where name like \'%NLS%\';
NLS_CHARACTERSET
zhs16gbk
二 客戶端字符集(NLS_LANG參數(shù))
1 客戶端字符集含義
客戶端字符集定義了客戶端字符數(shù)據(jù)的編碼方式,任何發(fā)自或發(fā)往客戶端的字符數(shù)據(jù)均使用客戶端定義的字符集編碼,客戶端可以看作是能與數(shù)據(jù)庫直接連接的各種應(yīng)用,例如sqlplus,exp/imp等??蛻舳俗址峭ㄟ^設(shè)置NLS_LANG參數(shù)來設(shè)定的。
2 查詢oracle client端的字符集
這個比較簡單。在windows平臺下,就是注冊表里面相應(yīng)OracleHome的NLS_LANG。
還可以在dos窗口里面自己設(shè)置,比如:
set nls_lang=AMERICAN_AMERICA.ZHS16GBK
這樣就只影響這個窗口里面的環(huán)境變量。
在unix平臺下,就是環(huán)境變量NLS_LANG。
$echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
如果檢查的結(jié)果發(fā)現(xiàn)server端與client端字符集不一致,請統(tǒng)一修改為同server端相同的字符集。
3 客戶端字符集設(shè)置方法
1)UNIX環(huán)境
$NLS_LANG=“simplified chinese”_china.zhs16gbk
$export NLS_LANG
編輯oracle用戶的profile文件
或者是臨時改變export NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
2)Windows環(huán)境
編輯注冊表
Regedit.exe---HKEY_LOCAL_MACHINE---SOFTWARE---ORACLE—HOME0

網(wǎng)站題目:修改oracle字符集
URL地址:http://muchs.cn/article44/chcpee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、面包屑導(dǎo)航、電子商務(wù)定制網(wǎng)站、網(wǎng)站營銷網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)