oracle 字符集修改

2021-07-14 19:34:35 字數 4533 閱讀 5397

一、什麼是oracle字符集 

oracle字符集是乙個位元組資料的解釋的符號集合,有大小之分,有相互的包容關係。oracle 支援國家語言的體系結構允許你使用本地化語言來儲存,處理,檢索資料。它使資料庫工具,錯誤訊息,排序次序,日期,時間,貨幣,數字,和日曆自動適應本地化語言和平台。 

影響oracle資料庫字符集最重要的引數是nls_lang引數。 

它的格式如下:   nls_lang = language_territory.charset 

它有三個組成部分(語言、地域和字符集),每個成分控制了nls子集的特性。 

其中: 

language 指定伺服器訊息的語言,territory 指定伺服器的日期和數字格式,charset 指定字符集。如:american _ america. zhs16gbk 

從nls_lang的組成我們可以看出,真正影響資料庫字符集的其實是第三部分。 

所以兩個資料庫之間的字符集只要第三部分一樣就可以相互匯入匯出資料,前面影響的只是提示資訊是中文還是英文。 

二.檢視資料庫字符集 

這涉及三方面的字符集, 

一是oracel server端的字符集; 

二是oracle client端的字符集; 

三是dmp檔案的字符集。 

在做資料匯入的時候,需要這三個字符集都一致才能正確匯入。 

1、查詢oracle server端的字符集 

有很多種方法可以查出oracle server端的字符集,比較直觀的查詢方法是以下這種: 

sql>select userenv(『language』) from dual; 

結果類似如下:american _ america. zhs16gbk 

2、如何查詢dmp檔案的字符集 

用oracle的exp工具匯出的dmp檔案也包含了字符集資訊,dmp檔案的第2和第3個位元組記錄了dmp檔案的字符集。如果dmp檔案不大,比如只有幾m或幾十m,可以用ultraedit開啟(16進製制方式),看第2第3個位元組的內容,如0354,然後用以下sql查出它對應的字符集: 

sql> select nls_charset_name(to_number('0354','***x')) from dual; 

zhs16gbk 

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

cat exp.dmp |od -x|head -1|awk ''|cut -c 3-6 

然後用上述sql也可以得到它對應的字符集。 

3、查詢oracle client端的字符集 

這個比較簡單。 

在windows平台下,就是登錄檔裡面相應oraclehome的nls_lang。還可以在dos視窗裡面自己設定,比如:   set nls_lang=american_america.zhs16gbk 

這樣就只影響這個視窗裡面的環境變數。 

在unix平台下,就是環境變數nls_lang。 

$echo $nls_lang 

american_america.zhs16gbk 

如果檢查的結果發現server端與client端字符集不一致,請統一修改為同server端相同的字符集。 

補充: 

(1).資料庫伺服器字符集 

select * from nls_database_parameters 

**於props$,是表示資料庫的字符集。 

(2).客戶端字符集環境 

select * from nls_instance_parameters 

其**於v$parameter,表示客戶端的字符集的設定,可能是引數檔案,環境變數或者是登錄檔 

(3).會話字符集環境 

select * from nls_session_parameters 

**於v$nls_parameters,表示會話自己的設定,可能是會話的環境變數或者是alter session完成,如果會話沒有特殊的設定,將與nls_instance_parameters一致。 

(4).客戶端的字符集要求與伺服器一致,才能正確顯示資料庫的非ascii字元。如果多個設定存在的時候,alter session>環境變數》登錄檔》引數檔案 

字符集要求一致,但是語言設定卻可以不同,語言設定建議用英文。如字符集是zhs16gbk,則nls_lang可以是american_america.zhs16gbk。 

三、修改oracle的字符集 

上文說過,oracle的字符集有互相的包容關係。如us7ascii就是zhs16gbk的子集,從us7ascii到zhs16gbk不會有資料解釋上的問題,不會有資料丟失。在所有的字符集中utf8應該是最大,因為它基於unicode,雙位元組儲存字元(也因此在儲存空間上占用更多)。 

一旦資料庫建立後,資料庫的字符集理論上講是不能改變的。因此,在設計和安裝之初考慮使用哪一種字符集十分重要。根據oracle的官方說明,字符集的轉換是從子集到超集受支援,反之不行。如果兩種字符集之間根本沒有子集和超集的關係,那麼字符集的轉換是不受oracle支援的。對資料庫server而言,錯誤的修改字符集將會導致很多不可測的後果,可能會嚴重影響資料庫的正常執行,所以在修改之前一定要確認兩種字符集是否存在子集和超集的關係。一般來說,除非萬不得已,我們不建議修改oracle資料庫server端的字符集。特別說明,我們最常用的兩種字符集zhs16gbk和zhs16cgb231280之間不存在子集和超集關係,因此理論上講這兩種字符集之間的相互轉換不受支援。 

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

在oracle 8之前,可以用直接修改資料字典表props$來改變資料庫的字符集。但oracle8之後,至少有三張系統表記錄了資料庫字符集的資訊,只改props$表並不完全,可能引起嚴重的後果。正確的修改方法如下: 

$sqlplus /nolog 

sql>conn / as sysdba;   若此時資料庫伺服器已啟動,則先執行shutdown immediate命令關閉資料庫伺服器,然後執行以下命令: 

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 

注意:如果沒有大物件,在使用過程中進行語言轉換沒有什麼影響,(切記設定的字符集必須是oracle支援,不然不能start) 按上面的做法就可以,但是可能會出現『ora-12717: cannot alter database national character set when nclob data exists』 這樣的提示資訊 

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

乙個是,利用internal_use 關鍵字修改區域設定, 

還有乙個是利用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的區域設定就沒有問題 

2、修改dmp檔案字符集 

上文說過,dmp檔案的第2第3位元組記錄了字符集資訊,因此直接修改dmp檔案的第2第3位元組的內容就可以『騙』過oracle的檢查。這樣做理論上也僅是從子集到超集可以修改,但很多情況下在沒有子集和超集關係的情況下也可以修改,我們常用的一些字符集,如us7ascii,we8iso8859p1,zhs16cgb231280,zhs16gbk基本都可以改。因為改的只是dmp檔案,所以影響不大。 

具體的修改方法比較多,最簡單的就是直接用ultraedit修改dmp檔案的第2和第3個位元組。 

比如想將dmp檔案的字符集改為zhs16gbk,可以用以下sql查出該種字符集對應的16進製制**:   sql> select to_char(nls_charset_id('zhs16gbk'), '***x') from dual; 

0354 

然後將dmp檔案的2、3位元組修改為0354即可。 

如果dmp檔案很大,用ue無法開啟,就需要用程式的方法了

oracle 修改字符集

在大型資料庫管理系統中,oracle資料庫不論在資料庫管理能力還是在安全性方面都是無可非議的。國內企業使用oracle資料庫的也較多,但是由於oracle不同版本的字符集,給資料顯示 資料備份 資料轉換等實際工作帶來了不少麻煩。一 字符集引數 一旦資料庫建立後,資料庫的字符集是不能改變的。因此,考慮...

oracle 修改字符集

通過 sql select from nls database parameters 來檢查字符集引數 設定 sql shutdown immediate sql startup mount sql alter system enable restricted session sql alter s...

oracle修改字符集

檢視oracle服務端編碼 select from sys.nls database parameters 檢視client編碼 select from sys.nls session parameters 修改客戶端編碼 翻開運轉器進入登錄檔編輯 運轉 regedit 找到hkey local m...