oracle 字符集總結(超出GBK範圍的字符存取問題未解決)

字符集總結:
一、服務器的字符集(用來存儲數據用的編碼格式)
二、操作系統字符集(用來顯示、解碼/編碼與oracle交互的編碼格式)
三、oracle客戶端字符集(用於轉換操作系統、服務器端編碼/解碼格式問題)

 

後續在使用過程中領悟到:
最基礎層是 數據庫(創建庫時的字符集)
第二層是:操作系統
第三層是:終端顯示

保持三層爲 相同字符集 既可,但要注意的是,必須以創建數據庫時所使用的 字符集 爲基準,進行設置 操作系統 、 終端的字符集,就基本沒有問題;

 

引用一段話:

字符集,實質就是按照一定的字符編碼方案,對一組特定的符號,分別賦予不同數值編碼的集合。Oracle數據庫最早支持的編碼方案是US7ASCII。Oracle的字符集命名遵循以下命名規則:<Language><bitsize><encoding>   即:  <語言><比特位數><編碼> 。比如: AL32UTF8表示:AL,代表all,指使用所有語言;32,,32位;UTF8編碼。查看環境變量發現:NLS_LANG=American_America.AL32UTF8,American表示語言;America表示地區;AL32UTF8字符集類型。

         AL32UTF8和UTF8有什麼區別呢?Oracle的UTF8字符集由來已久,至少在8的時候就已經存在了,而對應的是UNICODE 3.0。而AL32UTF8字符集是9i纔出現的,其對應的是UNICODE 5.0。這兩種字符集的區別在於,UNICODE 5.0與3.0相比,又增加了一些新的補充字符。但是在實際當中,使用到這些新增字符的可能性非常小,因此絕大部分情況下,選擇UTF8也是足夠的。AL32UTF8字符集是9i纔出現的,那麼對於9i以後的版本訪問沒有任何問題,但是對於8i及以前的版本,則不認識這個字符集。這就使得8i及更低版本的客戶端在訪問9i以上AL32UTF8的數據庫時,會碰到各種各樣的問題。因此,如果數據庫版本都在9i及其以上,不需要考慮ORACLE8的數據庫,建議使用AL32UTF8字符集,它採用的Unicode標準要比UTF8採用的Unicode標準更新,支持的字符也更多一些。如果要考慮ORACLE8數據庫,建議使用UTF8字符集,它的兼容性好,在ORACLE8及8I數據庫上使用AL32UTF8字符集容易出現問題。隨着現在版本11g逐漸開始稱爲主流版本,8i客戶端的情況已經越來越少見了,因此在11.2的DBCA中,UTF8已經不是推薦字符集列表中的一員了。我們在遇到不兼容的問題時就要修改字符集。

 


一、服務器的字符集(用來存儲數據用的編碼格式)
    編碼字符集包含關係:ZHS32GB18030 > ZHS16GBK > ZHS16CGB231280 參考文章:http://docs.oracle.com/cd/B10501_01/server.920/a96529/appa.htm#956722
oracle 支持的字符集:
    在 oracle 官方文檔中提到支持以下中文字符集:
         ZHS16CGB231280  CGB2312-80 16-bit Simplified Chinese  -- 11g 已不支持
         ZHS16GBK        GBK 16-bit Simplified Chinese
         ZHS32GB18030    GB18030-2000                          -- 11g 已不支持
         ZHT16BIG5       BIG5 16-bit Traditional Chinese       -- 11g 已不支持
         ZHT32EUC        EUC 32-bit Traditional Chinese
         ZHT16HKSCS      MS Windows Code Page 950 with Hong Kong Supplementary Character Set
         ZHT16MSWIN950   MS Windows Code Page 950 Traditional Chinese
    而我在11g創建 DB 時,選項中只支持以下幾種中文字符集:
         ZHS16GBK        GBK 16-bit Simplified Chinese    -- 我們中國大陸只能選它了...
         ZHT16HKSCS      MS Windows Code Page 950 with Hong Kong Supplementary Character Set
         ZHT16MSWIN950   MS Windows Code Page 950 Traditional Chinese
         ZHT32EUC        EUC 32-bit Traditional Chinese
         AL32UTF8        Unicode 4.0 UTF-8 Universal character set    --  實驗時,使用的是字符集,證明可以存儲 ZHS16GBK 以外的字符集
 

二、操作系統字符集(用來顯示、解碼/編碼與oracle交互的編碼格式)
    linux命令下:
       locale -a                -- 查看操作系統支持哪些字符集;
       locale charmap           -- 看操作系統的字符解碼是哪種方式;
       export LANG=zh_CN.UTF-8  -- 設置操作系統 爲 中文,utf8編碼方式

三、oracle客戶端字符集(用於轉換操作系統、服務器端編碼/解碼格式問題)
    linux命令下:
    export NLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8'  -- 設置 語言:簡體中文   區域:中國  編碼:utf8


實驗:
測試字符(以下字符都不在GBK字符範圍內):

<由於這些字符不能發佈到CSDN,一發布,下面文章就沒有了,所以只能以圖片方式發了>

一、 gbk字符集的情況下
  條件:
        服務器端oracle的字符集:ZHS16GBK
        linux終端環境變量設置 LANG:export LANG="zh_CN.GB18030"
        linux終端環境變量設置 NLS_LANG: export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS32GB18030"
       
  CREATE TABLE TST_CHARACTER
  (
    F1 NVARCHAR2(8)
  );
 
 
   結果:
   一、sqlplus中試驗
     1.  INSERT INTO TST_CHARACTER values('');  -- 成功

         select * from TST_CHARACTER ;            -- 失敗,亂碼;
            F1
            --------------------------------
            ??
         select * from TST_CHARACTER where F1=''  -- 查詢成功,但是亂碼;

   二、P/L SQL Developer 8.0 版本試驗

    1. select * from TST_CHARACTER for update;    -- 使用把拷貝進去,成功顯示, 但是不能使用where 條件查詢;
       select * from TST_CHARACTER where F1=''  -- 查詢不成功;
       select * from TST_CHARACTER                -- 能顯示 '' 字
      
二、 AL32UTF8 字符集的情況下
  條件:
        服務器端oracle的字符集: AL32UTF8
        linux終端環境變量設置 LANG:export LANG="zh_CN.UTF-8"
        linux終端環境變量設置 NLS_LANG: export NLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8'
       
  CREATE TABLE TST_CHARACTER
  (
    F1 NVARCHAR2(8)
  );
 
   結果:
   一、sqlplus中試驗
   SQL> INSERT INTO TST_CHARACTER values('');  -- 成功
   SQL> select * from tst_character;             -- 失敗,亂碼;
   
   F1
   --------------------------------
   ��
   SQL> select * from TST_CHARACTER where F1='' ;  -- 成功,但顯示爲亂碼;
   
   二、P/L SQL Developer 8.0 版本試驗
    INSERT INTO TST_CHARACTER values('') ;     -- 成功
    commit;
    select * from TST_CHARACTER   -- 失敗,亂碼;
    select * from TST_CHARACTER  where F1='' for update;   -- 成功找到數據,但顯示爲亂碼;
   


直到現在,還沒有找到一種方法可以正確存入,並能條件查詢,並正確反顯的。。。。。。。。。
有時間再搞,得睡了。。。。。

 

以上如果有哪位大蝦能幫解決一下麼,謝謝啦 ~!~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章