程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> ORACLE字符集基礎知識

ORACLE字符集基礎知識

編輯:Oracle教程

概念描敘

   ORACLE數據庫有國家字符集(national character set)與數據庫字符集(database character set)之分。兩者都是在創建數據庫時需要設置的。國家字符集主要是用於NCHAR、NVARCHAR、NCLOB類型的字段數據,而數據庫字符集使用很廣泛,它用於:CHAR、VARCHAR、CLOB、LONG類型的字段數據;

   

   ORACLE的字符集名字一般由以下部分組成:語言或區域、表示一個字符的比特位數、標准字符集名稱(可選項,S或C,表示服務器或客戶端)。ORACLE字符集UTF8與UTFE不符合此規定,其它基本都是這種格式。NLS_LANG=<Language>_<Territory>.<Clients Characterset>

set nls_lang=AMERICAN_AMERICA.UTF8

set nls_lang=SIMPLIFIED CHINESE_AMERICA.UTF8

NLS( National Language Support)國家語言支持。NLS是數據庫的一個非常強大的特性,它控制著數據的許多方面:比如數據如何存儲,一般來說它控制著以下兩個方面:

文本數據持久存儲在磁盤上時如何編碼

透明的將數據從一個字符集轉換到另外一個字符集。

假設你在數據庫中用WE8ISO8859P1 字符集存儲8 位的數據,但是你的某些客戶使用的是一種7 位字符集,如US7ASCII字符集轉換過程通常會修改數據,而你往往會把一個較大的字符集(在此例中就是8 位字符集)映射到一個較小的字符集(此例中的7 位字符集)。這是一種有損轉換(lossy conversion),字符就會被修改,這只是因為:較小的字符集不可能表示較大字符集中的每一個字符。但是這種轉換必須發生。這也是亂碼產生的原因。如果數據庫以一種單字節字符集存儲數據,但是客戶(如一個Java 應用,因為Java 語言使用Unicode)希望數據采用多字節表示,就必須執行轉換,只有這樣客戶應用才能使用這些數據。

ORACLE支持的Unicode字符集有以下幾種,下面的列表給出了字符集的名稱、對應的數據庫版本范圍、采用的Unicode的版本。

AL24UTFFSS:是ORACLE第一種支持Unicode的字符集,從7.2版本開始使用,但是它支持的Unicode版本為1.1,因此從9i開始就不支持此字符集了。

UTF8 : 是ORACLE從ORACLE8開始使用的屬於UTF-8編碼的字符集,從ORACLE8.0到ORACLE8.16,Unicode版本為2.1,而ORACLE817到10g,采用的Unicode標 准為3.0

UTFE :用於EBCDIC碼平台上的數據庫Unicode字符集。因此它屬於專用系統使用的字符集,其它屬性與UTF8基本相同。

AL32UTF8 :是從ORACLE9開始使用的屬於UTF-8編碼的字符集,與UTF8相比,它采用的Unicode版本更新,在10g版本中使用的是Unicode 4.01標准,而UTF8因 為兼容性的考慮,在10g版本中用的是Unicode 3.0標准。

AL16UTF16:是ORACLE第一種采用UTF-16編碼方式的字符集,從ORACLE9開始使用,是作為缺省的國家字符集使用,它不能被用作數據庫的字符集。這是因為數 據庫的字符集決定了SQL與PL/SQL源碼的編碼方式,對於UTF-16這種使用固定的兩個字節來表示英文字母的編碼方案來說,確實不適於用作數據庫 的字符集,ORACLE目前采用的數據庫字符集都是基於ASCII或EBCDID作為子集的編碼方案。

對於US7ASCII,表示區域是US,用7個比特位表示一個字符,標准的字符集名稱為ASCII。

對於中文字符集ZHS16GBK,表示簡體中文(ZHT為繁體中文),一個字符需要16位比特,標准的字符集名稱為GBK。而ZHS16CGB231280表示簡體中文,一個字符需要16位比特,標准的字符集名稱為GB231280,屬於我們前面提過的1981年發布的GB2312-80標准。雖然我們說,GBK編碼標准是GB2312編碼標准的擴展,但是數據庫字符集ZHS16GBK與ZHS16CGB231280之間卻不是嚴格的超集與子集的關系,主要是有些漢字的編碼在兩個字符集中的數值是不同的,因此它們進行字符集轉換時會出現問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved