oracle字符集理解:
一.引言
ORACLE數據庫字符集,即Oracle全球化支持(Globalization Support),或即國家語言支持(NLS)其作用是用本國語言和格式來存儲、處理和檢索數據。利用全球化支持,ORACLE為用戶提供自己熟悉的數據庫母語環境,諸如日期格式、數字格式和存儲序列等。Oracle可以支持多種語言及字符集,其中oracle8i支持48種語言、76個國家地域、229 種字符集,而oracle9i則支持57種語言、88個國家地域、235種字符集。由于oracle字符集種類多,且在存儲、檢索、遷移oracle數據時多個環節與字符集的設置密切相關,因此在實際的應用中,數據庫開發和管理人員經常會遇到有關oracle字符集方面的問題。本文通過以下幾個方面闡述,對oracle字符集做簡要分析
二.字符集基本知識
2.1字符集
實質就是按照一定的字符編碼方案,對一組特定的符號,分別賦予不同數值編碼的集合。Oracle數據庫最早支持的編碼方案是US7ASCII。
Oracle的字符集命名遵循以下命名規則:
即: <語言><比特位數><編碼>
比如: 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修改數據庫字符集
按照上文所說,數據庫字符集在創建后原則上不能更改。如果需要修改字符集,通常需要導出數據庫數據,重建數據庫,再導入數據庫數據的方式來轉換,或通過 ALTER DATABASE CHARACTER SET語句修改字符集,但創建數據庫后修改字符集是有限制的,只有新的字符集是當前字符集的超集時才能修改數據庫字符集,例如UTF8是US7ASCII 的超集,修改數據庫字符集可使用ALTER DATABASE CHARACTER SET UTF8。正確的修改方法如下:
$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
2.5 客戶端字符集(NLS_LANG參數)
2.5.1客戶端字符集含義
客戶端字符集定義了客戶端字符數據的編碼方式,任何發自或發往客戶端的字符數據均使用客戶端定義的字符集編碼,客戶端可以看作是能與數據庫直接連接的各種應用,例如sqlplus,exp/imp等??蛻舳俗址峭ㄟ^設置NLS_LANG參數來設定的。
2.5.2 NLS_LANG參數格式
NLS_LANG=_.
原文轉自:http://blogread.cn/it/article/4654