溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle數(shù)據(jù)庫字符集問題

發(fā)布時間:2020-06-06 19:04:39 來源:網(wǎng)絡(luò) 閱讀:398 作者:春天的金縷 欄目:數(shù)據(jù)庫

Oracle數(shù)據(jù)庫字符集涉及到三個方面:

  1. oracle  server端字符集

  2. oracle  client端字符集

  3. dmp文件字符集




首先需知道,影響數(shù)據(jù)庫字符集最重要的是參數(shù)是NLS_LANG

格式  NLS_LANG = language_territory.charset 由三部分組成,語言、地域和字符集

Language: 指定服務(wù)器消息的語言, 影響提示信息是中文還是英文

Territory: 指定服務(wù)器的日期和數(shù)字格式,

Charset:  指定字符集

所以,兩個數(shù)據(jù)庫之間的字符集只要第三部分一樣就可以相互導入導出數(shù)據(jù),前面影響的只是提示信息是中文還是英文。


一、

查看數(shù)據(jù)庫服務(wù)器字符集

select * from nls_database_parameters

修改server端字符集(不建議使用)

 

1.       關(guān)閉數(shù)據(jù)庫

SQL>SHUTDOWN IMMEDIATE

 

2. 啟動到Mount

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 AL16UTF16;

--如果是從子集到父集,需要使用INTERNAL_USE 參數(shù),跳過超子集檢測

SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;

SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16;

 

SQL>SHUTDOWN IMMEDIATE;

SQL>STARTUP

注意:如果沒有大對象,在使用過程中進行語言轉(zhuǎn)換沒有什么影響,(切記設(shè)定的字符集必須是ORACLE支持,不然不能start) 按上面的做法就可以。

 

若出現(xiàn)‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 這樣的提示信息,

要解決這個問題有兩種方法

1. 利用INTERNAL_USE 關(guān)鍵字修改區(qū)域設(shè)置,

2. 利用re-create,但是re-create有點復雜,所以請用internal_use

 

SQL>SHUTDOWN IMMEDIATE;

SQL>STARTUP MOUNT EXCLUSIVE;

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 NATIONAL CHARACTER SET INTERNAL_USE UTF8;

SQL>SHUTDOWN immediate;

SQL>startup;

如果按上面的做法做,National charset的區(qū)域設(shè)置就沒有問題


二、

查看客戶端字符集

  

select * from nls_instance_parameters

表示客戶端的字符集的設(shè)置,可能是參數(shù)文件,環(huán)境變量或者是注冊表


在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端相同的字符集。

 

修改客戶端字符集:

 1)UNIX環(huán)境

         $NLS_LANG=“simplified chinese”_china.zhs16gbk

         $export NLS_LANG

         編輯oracle用戶的profile文件

    2)Windows環(huán)境

         編輯注冊表

         Regedit.exe ---》HKEY_LOCAL_MACHINE ---》SOFTWARE ---》ORACLE-HOME

  或者在窗口設(shè)置:

        set nls_lang=AMERICAN_AMERICA.ZHS16GBK


三、

查看dmp文件字符集

用oracle的exp工具導出的dmp文件也包含了字符集信息,dmp文件的第2和第3個字節(jié)記錄了dmp文件的字符集。如果dmp文件不大,比如只有幾M或幾十M,可以用UltraEdit打開(16進制方式),看第2第3個字節(jié)的內(nèi)容,如0354,然后用以下SQL查出它對應(yīng)的字符集:

SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;

ZHS16GBK

 

如果dmp文件很大,比如有2G以上(這也是最常見的情況),用文本編輯器打開很慢或者完全打不開,可以用以下命令(在unix主機上):

cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6

然后用上述SQL也可以得到它對應(yīng)的字符集。


修改dmp文件字符集

dmp文件的第2第3字節(jié)記錄了字符集信息,因此直接修改dmp文件的第2第3字節(jié)的內(nèi)容就可以‘騙’過oracle的檢查。這樣做理論上也僅是從子集到超集可以修改,但很多情況下在沒有子集和超集關(guān)系的情況下也可以修改,我們常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因為改的只是dmp文件,所以影響不大。

 

具體的修改方法比較多,最簡單的就是直接用UltraEdit修改dmp文件的第2和第3個字節(jié)。

比如想將dmp文件的字符集改為ZHS16GBK,可以用以下SQL查出該種字符集對應(yīng)的16進制代碼: SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;

0354

然后將dmp文件的2、3字節(jié)修改為0354即可。

如果dmp文件很大,用ue無法打開,就需要用程序的方法了。


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI