㈠ 如何查看和修改Oracle資料庫伺服器端的字元集
Oracle 字元集的查看和修改
一、什麼是Oracle字元集
Oracle字元集是一個位元組數據的解釋的符號集合,有大小之分,有相互的包容關系。ORACLE 支持國家語言的體系結構允許你使用本地化語言來存儲,處理,檢索數據。它使資料庫工具,錯誤消息,排序次序,日期,時間,貨幣,數字,和日歷自動適應本地化語言和平台。
影響Oracle資料庫字元集最重要的參數是NLS_LANG參數。
它的格式如下: NLS_LANG = language_territory.charset
它有三個組成部分(語言、地域和字元集),每個成分控制了NLS子集的特性。
其中:
Language: 指定伺服器消息的語言, 影響提示信息是中文還是英文
Territory: 指定伺服器的日期和數字格式,
Charset: 指定字元集。
如:AMERICAN _ AMERICA. ZHS16GBK
從NLS_LANG的組成我們可以看出,真正影響資料庫字元集的其實是第三部分。
所以兩個資料庫之間的字元集只要第三部分一樣就可以相互導入導出數據,前面影響的只是提示信息是中文還是英文。
二.字元集的相關知識:
2.1 字元集
實質就是按照一定的字元編碼方案,對一組特定的符號,分別賦予不同數值編碼的集合。Oracle資料庫最早支持的編碼方案是US7ASCII。
Oracle的字元集命名遵循以下命名規則:
<Language><bit size><encoding>
即: <語言><比特位數><編碼>
比如: ZHS16GBK表示採用GBK編碼格式、16位(兩個位元組)簡體中文字元集
2.2 字元編碼方案
2.2.1 單位元組編碼
(1)單位元組7位字元集,可以定義128個字元,最常用的字元集為US7ASCII
(2)單位元組8位字元集,可以定義256個字元,適合於歐洲大部分國家
例如:WE8ISO8859P1(西歐、8位、ISO標准8859P1編碼)
2.2.2 多位元組編碼
(1)變長多位元組編碼
某些字元用一個位元組表示,其它字元用兩個或多個字元表示,變長多位元組編碼常用於對亞洲語言的支持, 例如日語、漢語、印地語等
例如:AL32UTF8(其中AL代表ALL,指適用於所有語言)、zhs16cgb231280
(2)定長多位元組編碼
每一個字元都使用固定長度位元組的編碼方案,目前oracle唯一支持的定長多位元組編碼是AF16UTF16,也是僅用於國家字元集
2.2.3 unicode編碼
Unicode是一個涵蓋了目前全世界使用的所有已知字元的單一編碼方案,也就是說Unicode為每一個字元提供唯一的編碼。UTF-16是unicode的16位編碼方式,是一種定長多位元組編碼,用2個位元組表示一個unicode字元,AF16UTF16是UTF-16編碼字元集。
UTF-8是unicode的8位編碼方式,是一種變長多位元組編碼,這種編碼可以用1、2、3個位元組表示一個unicode字元,AL32UTF8,UTF8、UTFE是UTF-8編碼字元集
2.3 字元集超級
當一種字元集(字元集A)的編碼數值包含所有另一種字元集(字元集B)的編碼數值,並且兩種字元集相同編碼數值代表相同的字元時,則字元集A是字元集B的超級,或稱字元集B是字元集A的子集。
Oracle8i和oracle9i官方文檔資料中備有子集-超級對照表(subset-superset pairs),例如:WE8ISO8859P1是WE8MSWIN1252的子集。由於US7ASCII是最早的Oracle資料庫編碼格式,因此有許多字元集是US7ASCII的超集,例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。
2.4 資料庫字元集(oracle伺服器端字元集)
資料庫字元集在創建資料庫時指定,在創建後通常不能更改。在創建資料庫時,可以指定字元集(CHARACTER SET)和國家字元集(NATIONAL CHARACTER SET)。
2.4.1字元集
(1)用來存儲CHAR, VARCHAR2, CLOB, LONG等類型數據
(2)用來標示諸如表名、列名以及PL/sql變數等
(3)用來存儲SQL和PL/SQL程序單元等
2.4.2國家字元集:
(1)用以存儲NCHAR, NVARCHAR2, NCLOB等類型數據
(2)國家字元集實質上是為oracle選擇的附加字元集,主要作用是為了增強oracle的字元處理能力,因為NCHAR數據類型可以提供對亞洲使用定長多位元組編碼的支持,而資料庫字元集則不能。國家字元集在oracle9i中進行了重新定義,只能在unicode編碼中的AF16UTF16和UTF8中選擇,默認值是AF16UTF16
2.4.3查詢字元集參數
可以查詢以下數據字典或視圖查看字元集設置情況
nls_database_parameters、props$、v$nls_parameters
查詢結果中NLS_CHARACTERSET表示字元集,NLS_NCHAR_CHARACTERSET表示國家字元集
2.4.4修改資料庫字元集
按照上文所說,資料庫字元集在創建後原則上不能更改。不過有2種方法可行。
1. 如果需要修改字元集,通常需要導出資料庫數據,重建資料庫,再導入資料庫數據的方式來轉換。
2. 通過ALTER DATABASE CHARACTER SET語句修改字元集,但創建資料庫後修改字元集是有限制的,只有新的字元集是當前字元集的超集時才能修改資料庫字元集,例如UTF8是US7ASCII的超集,修改資料庫字元集可使用ALTER DATABASE CHARACTER SET UTF8。
2.5 客戶端字元集(NLS_LANG參數)
2.5.1客戶端字元集含義
客戶端字元集定義了客戶端字元數據的編碼方式,任何發自或發往客戶端的字元數據均使用客戶端定義的字元集編碼,客戶端可以看作是能與資料庫直接連接的各種應用,例如sqlplus,exp/imp等。客戶端字元集是通過設置NLS_LANG參數來設定的。
2.5.2 NLS_LANG參數格式
NLS_LANG=<language>_<territory>.<client character set>
Language: 顯示oracle消息,校驗,日期命名
Territory:指定默認日期、數字、貨幣等格式
Client character set:指定客戶端將使用的字元集
例如:NLS_LANG=AMERICAN_AMERICA.US7ASCII
AMERICAN是語言,AMERICA是地區,US7ASCII是客戶端字元集
2.5.3客戶端字元集設置方法
1)UNIX環境
$NLS_LANG=「simplified chinese」_china.zhs16gbk
$export NLS_LANG
編輯oracle用戶的profile文件
2)Windows環境
編輯注冊表
Regedit.exe ---》 HKEY_LOCAL_MACHINE ---》SOFTWARE ---》 ORACLE-HOME
2.5.4 NLS參數查詢
Oracle提供若干NLS參數定製資料庫和用戶機以適應本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通過查詢以下數據字典或v$視圖查看。
NLS_DATABASE_PARAMETERS:顯示資料庫當前NLS參數取值,包括資料庫字元集取值
NLS_SESSION_PARAMETERS: 顯示由NLS_LANG 設置的參數,或經過alter session 改變後的參數值(不包括由NLS_LANG 設置的客戶端字元集)
NLS_INSTANCE_PARAMETE: 顯示由參數文件init<SID>.ora 定義的參數
V$NLS_PARAMETERS:顯示資料庫當前NLS參數取值
2.5.5修改NLS參數
使用下列方法可以修改NLS參數
(1)修改實例啟動時使用的初始化參數文件
(2)修改環境變數NLS_LANG
(3)使用ALTER SESSION語句,在oracle會話中修改
(4)使用某些SQL函數
NLS作用優先順序別:Sql function > alter session > 環境變數或注冊表 > 參數文件 > 資料庫默認參數
三.EXP/IMP 與 字元集
3.1 EXP/IMP
Export 和 Import 是一對讀寫Oracle數據的工具。Export 將 Oracle 資料庫中的數據輸出到操作系統文件中, Import 把這些文件中的數據讀到Oracle 資料庫中,由於使用exp/imp進行數據遷移時,數據從源資料庫到目標資料庫的過程中有四個環節涉及到字元集,如果這四個環節的字元集不一致,將會發生字元集轉換。
EXP
____________ _________________ _____________
|imp導入文件|<-|環境變數NLS_LANG|<-|資料庫字元集|
------------ ----------------- -------------
IMP
____________ _________________ _____________
|imp導入文件|->|環境變數NLS_LANG|->|資料庫字元集|
------------ ----------------- -------------
四個字元集是
(1)源資料庫字元集
(2)Export過程中用戶會話字元集(通過NLS_LANG設定)
(3)Import過程中用戶會話字元集(通過NLS_LANG設定)
(4)目標資料庫字元集
3.2導出的轉換過程
在Export過程中,如果源資料庫字元集與Export用戶會話字元集不一致,會發生字元集轉換,並在導出文件的頭部幾個位元組中存儲Export用戶會話字元集的ID號。在這個轉換過程中可能發生數據的丟失。
例:如果源資料庫使用ZHS16GBK,而Export用戶會話字元集使用US7ASCII,由於ZHS16GBK是16位字元集,而US7ASCII是7位字元集,這個轉換過程中,中文字元在US7ASCII中不能夠找到對等的字元,所以所有中文字元都會丟失而變成「?? 」形式,這樣轉換後生成的Dmp文件已經發生了數據丟失。
因此如果想正確導出源資料庫數據,則Export過程中用戶會話字元集應等於源資料庫字元集或是源資料庫字元集的超集
3.3導入的轉換過程
(1)確定導出資料庫字元集環境
通過讀取導出文件頭,可以獲得導出文件的字元集設置
(2)確定導入session的字元集,即導入Session使用的NLS_LANG環境變數
(3)IMP讀取導出文件
讀取導出文件字元集ID,和導入進程的NLS_LANG進行比較
(4)如果導出文件字元集和導入Session字元集相同,那麼在這一步驟內就不需要轉換, 如果不同,就需要把數據轉換為導入Session使用的字元集。可以看出,導入數據到資料庫過程中發生兩次字元集轉換
第一次:導入文件字元集與導入Session使用的字元集之間的轉換,如果這個轉換過程不能正確完成,Import向目標資料庫的導入過程也就不能完成。
第二次:導入Session字元集與資料庫字元集之間的轉換。
四. 查看資料庫字元集
涉及三方面的字元集,
1. oracel server端的字元集;
2. oracle client端的字元集;
3. dmp文件的字元集。
在做數據導入的時候,需要這三個字元集都一致才能正確導入。
4.1 查詢oracle server端的字元集
有很多種方法可以查出oracle server端的字元集,比較直觀的查詢方法是以下這種:
SQL> select userenv('language') from al;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
SQL>select userenv(『language』) from al;
AMERICAN _ AMERICA. ZHS16GBK
4.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','xxxx')) from al;
ZHS16GBK
如果dmp文件很大,比如有2G以上(這也是最常見的情況),用文本編輯器打開很慢或者完全打不開,可以用以下命令(在unix主機上):
cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6
然後用上述SQL也可以得到它對應的字元集。
4.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字元。
如果多個設置存在的時候,NLS作用優先順序別:Sql function > alter session > 環境變數或注冊表 > 參數文件 > 資料庫默認參數
字元集要求一致,但是語言設置卻可以不同,語言設置建議用英文。如字元集是zhs16gbk,則nls_lang可以是American_America.zhs16gbk。
五. 修改oracle的字元集
按照上文所說,資料庫字元集在創建後原則上不能更改。因此,在設計和安裝之初考慮使用哪一種字元集十分重要。對資料庫server而言,錯誤的修改字元集將會導致很多不可測的後果,可能會嚴重影響資料庫的正常運行,所以在修改之前一定要確認兩種字元集是否存在子集和超集的關系。一般來說,除非萬不得已,我們不建議修改oracle資料庫server端的字元集。特別說明,我們最常用的兩種字元集ZHS16GBK和ZHS16CGB231280之間不存在子集和超集關系,因此理論上講這兩種字元集之間的相互轉換不受支持。
不過修改字元集有2種方法可行。
1. 通常需要導出資料庫數據,重建資料庫,再導入資料庫數據的方式來轉換。
2. 通過ALTER DATABASE CHARACTER SET語句修改字元集,但創建資料庫後修改字元集是有限制的,只有新的字元集是當前字元集的超集時才能修改資料庫字元集,例如UTF8是US7ASCII的超集,修改資料庫字元集可使用ALTER DATABASE CHARACTER SET UTF8。
5.1 修改server端字元集(不建議使用)
1. 關閉資料庫
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 ZHS16GBK;
--如果是從子集到父集,需要使用INTERNAL_USE 參數,跳過超子集檢測
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL32UTF8;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
注意:如果沒有大對象,在使用過程中進行語言轉換沒有什麼影響,(切記設定的字元集必須是ORACLE支持,不然不能start) 按上面的做法就可以。
若出現『ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists』 這樣的提示信息,
要解決這個問題有兩種方法
1. 利用INTERNAL_USE 關鍵字修改區域設置,
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的區域設置就沒有問題
5.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'), 'xxxx') from al;
0354
然後將dmp文件的2、3位元組修改為0354即可。
如果dmp文件很大,用ue無法打開,就需要用程序的方法了。
5.3客戶端字元集設置方法
1)UNIX環境
$NLS_LANG=「simplified chinese」_china.zhs16gbk
$export NLS_LANG
編輯oracle用戶的profile文件
2)Windows環境
編輯注冊表
Regedit.exe ---》 HKEY_LOCAL_MACHINE ---》SOFTWARE ---》 ORACLE-HOME
或者在窗口設置:
set nls_lang=AMERICAN_AMERICA.ZHS16GBK
㈡ 如何查看oracle用的什麼字元集
查看oracle字元集方法如下:
1、單機電腦做小腳windows圖標,輸入框中輸入「cmd」
(2)oracle查詢資料庫字元集擴展閱讀:
甲骨文公司,全稱甲骨文股份有限公司(甲骨文軟體系統有限公司),是全球最大的企早圓業級軟體公司,總部位於美國加利福尼亞州的紅木灘。1989年正式進入中國市場。2013年,甲骨文已超越IBM,成為繼Microsoft後全球第二大軟體公司。
2017年6月7日發布的2017年美國《財富》500強,甲骨文公司排名第81位。 2017年6月,《2017年BrandZ最具價值全球品牌100強》公布,甲骨文公司排名第46位。
字元(Character)是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。字元集(Character set)是多個字元的集合,字元集種類較多,每個字元集包含的字元個數不同,常見字元集名稱:ASCII字元集、GB2312字元集、BIG5字元集、 GB18030字元集、Unicode字元集等。計算機要准確的處理各種字元集文字,需要進行字元編碼,以便計算機能夠識別和存儲各種文字。中文文字數目大,而且還分為簡體中文和繁體中文兩種不同書寫規則的搏睜銀文基宴字,而計算機最初是按英語單位元組字元設計的,因此,對中文字元進行編碼,是中文信息交流的技術基礎。
網路-字元集
網路-甲骨文公司
㈢ 怎樣察看oracle資料庫的字元集
Oracle資料庫查看和修改伺服器端的字元集的方法是本文主要要介紹的內容,接下來救讓我們一起來了解一下這部分內容。
A、oracle server 端字元集查詢 select userenv('language') from al 其中NLS_CHARACTERSET 為server端字元集 NLS_LANGUAGE 為 server端字元顯示形式
B、查詢oracle client端的字元集 $echo $NLS_LANG 如果發現你select 出來的數據是亂碼,請把client端的字元集配置成與linux操作系統相同的字元集。如果還是有亂碼,則有可能是資料庫中的數據存在問題,或者是oracle服務端的配置存在問題。
C、server端字元集修改 將資料庫啟動到RESTRICTED模式下做字元集更改: SQL> conn /as sysdba Connected. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 236000356 bytes Fixed Size 451684 bytes Variable Size 201326592 bytes Database Buffers 33554432 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. SQL> alter database open; Database altered. 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 提示我們的字元集:新字元集必須為舊字元集的超集,這時我們可以跳過超集的檢查做更改: SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK; Database altered. SQL> select * from v$nls_parameters; 略 19 rows selected. 重啟檢查是否更改完成: SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 236000356 bytes Fixed Size 451684 bytes Variable Size 201326592 bytes Database Buffers 33554432 bytes Redo Buffers 667648 bytes Database mounted. Database opened. SQL> select * from v$nls_parameters; 略 19 rows selected. 我們看到這個過程和之前ALTER DATABASE CHARACTER SET操作的內部過程是完全相同的,也就是說INTERNAL_USE提供的幫助就是使Oracle資料庫繞過了子集與超集的校驗。 這一方法在某些方面是有用處的,比如測試;應用於產品環境大家應該格外小心,除了你以外,沒有人會為此帶來的後果負責。 結語(我們不妨再說一次): 對於DBA來說,有一個很重要的原則就是:不要把你的資料庫置於危險的境地! 這就要求我們,在進行任何可能對資料庫結構發生改變的操作之前,先做有效的備份,很多DBA沒有備份的操作中得到了慘痛的教訓。
D、client端字元集修改 在 /home/oracle與 /root用戶目錄下的。bash_profile中 添加或修改 export NLS_LANG="AMERICAN_AMERICA.UTF8" 語句
希望可以幫到您,謝謝!
㈣ oracle資料庫裡面怎麼查看字元集
1、查詢Oracle Server端的字元集:
有很多種方法可以查出oracle server端的字元集,比較直觀的查詢方法是以下這種:
SQL>select userenv(『language』) from al;
結果如下: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','xxxx')) from al;
ZHS16GBK
3、查詢Oracle client端的字元集:
這個比較簡單。在Windows平台下,就是注冊表裡面相應OracleHome的NLS_LANG。還可以在Dos窗口裡面自己設置,比如:
set nls_lang=AMERICAN_AMERICA.ZHS16GBK
如果檢查的結果發現Server端與Client端字元集不一致,請統一修改為同Server端相同的字元集。