1. 程式人生 > >oracle 字符集總結(超出GBK範圍的字元存取問題未解決)

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;   -- 成功找到資料,但顯示為亂碼;
   


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

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

相關推薦

oracle 字符集總結超出GBK範圍字元存取問題解決

字符集總結: 一、伺服器的字符集(用來儲存資料用的編碼格式) 二、作業系統字符集(用來顯示、解碼/編碼與oracle互動的編碼格式) 三、oracle客戶端字符集(用於轉換作業系統、伺服器端編碼/解碼格式問題) 後續在使用過程中領悟到: 最基礎層是 資料庫(建立庫時的字符

字符集問題Unicode變為多位元組即能解決

嚴重性    程式碼    說明    專案    檔案    行    禁止顯示狀態 錯誤    C2664    “void ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar

Oracle 技巧總結:行轉列 及 列裝行

1.行轉列 oracle中行轉列 語法結構select listagg(column1, ',') within group(order by column2) from X;  如下圖所示: listagg(attr1, attr2):第一個引數是要行轉列的那個欄位

Oracle學習總結2——Oracle資料庫設計總結三大正規化

一、實體與表對應關係 表<=>實體,欄位<=>屬性。 二、表與表的關係(實體間的關係):一對一、一對多、多對多 一對一:一條記錄只對應其他表中的一條記錄有關係 學生基本資訊表t_student,成績表t_studentScore含有一個外來

LeetCode 總結 持續更新中。。。。

總結 get ngs multiply log 。。 icu ble 更新 No. Name Acceptance Difficulty Star 43 Multiply Strings 27.3% medium 3.5 90 Subsets II 36.5%

2048遊戲回想二:算法總結移動、合並、動畫等

switch com asm isp error 結束 復雜 因此 playsound 假設僅僅是單純的寫一個2048遊戲。讓這個遊戲能夠玩的話,工作量還是蠻小的。只

【團隊作業總結】個人總結從後端來看整個項目

map exp 失效 undefined defined 用戶名 目的 color scores 團隊作業總結(byPB16061082耿子鋼): 本次項目做的是一個作業管理系統,包括教師端和學生端,主要功能簡單來說為教師通過教師端來上傳學生名單,發布作業,批改作業,管理作

LeetCode 總結第1 7 9 13 14題

1 兩數之和 class Solution: def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: L

oracle sql小結主要講橫列轉換的例子decode 以及case

--建表 create table kecheng( id NUMBER, name VARCHAR2(20), course VARCHAR2(20), score NUMBER); --插入資料insert into kecheng (id, name, course, score)values (1

linux解壓命令總結zip,tar.gz tar.xz tar.lz

tar & tar.gz tar -xvf abc.tar tar -xvf abc.tar.gz tar.lz lzip -dv abc.lz   得到  abc.tar 再繼續解壓 tar.xz(壓縮比牛逼啊,320M

陣列的去重方法總結包括物件陣列的去重方法

陣列的去除在真實專案中是非常的常用,那麼在這裡總結一下物件陣列及基本型別陣列的去重方法,主要利用了物件的鍵值是唯一的一個特性。 1:去重方法一利用陣列的索引對應的值。 let arr = [2,3,3,3,2,4,2]; console.log("arr is a instance of a

Liunx:環境基礎開發工具使用總結基本操作命令及使用詳解

目錄 1vim的基本概念 2vim的基本操作 3vim正常模式命令集 1:插入模式 2:移動游標 3:刪除文字 4:複製 5:替換 6:撤銷 7:更改 8:跳到指定行 4vim末行模式命令集 分屏操作 編譯器的使用 1:背景知識 2:g

二分法總結 以後直接就是抄板子了!

這兩天又碰到了用到了二分法的題,但是由於我之前學的不是很清楚,許多二分的題都是憑感覺寫出二分格式,然後WA之後憑感覺調整(竟然還能A過!!),因此再次碰到之後就感覺還是需要總結一下,要不然以後太浪費時間了。 我們用套路的方法來二分: 對於一個區間[l,r],滿足 迴圈不變式:  &

vue總結包括:指令的使用,axios

一,axios的用法  1,配置:  *引入axios  *與APP.vue建立一個http-common.js檔案(使用axios模組,除錯埠)用來給其他模組複用 2,使用:  *在其他元件檔案中匯入http元件   va

struts2+spring+hibernate框架總結框架分析+環境搭建+例項原始碼下載

首先,SSH不是一個框架,而是多個框架(struts+spring+hibernate)的整合,是目前較流行的一種Web應用程式開源整合框架,用於構建靈活、易於擴充套件的多層Web應用程式。 整合SSH框架的系統從職責上分為四層:表示層、業務邏輯層、資料持久層和域模組層(實體層)。 Struts

c++:深淺拷貝總結深拷貝的傳統和現代寫法

深淺拷貝區別: 淺拷貝只拷貝指標,但拷貝後兩個指標指向同一個記憶體空間; 深拷貝不但對指標進行拷貝,而且對指標指向的內容進行拷貝, 呼叫拷貝建構函式後,淺拷貝還有聯絡,深拷貝的兩個物件完全獨立。 淺拷貝類似於檔案建立快捷方式,而深拷貝好比檔案複製。 編譯器預設提供的

setprecision、fixed、showpoint的用法總結經典!!超經典!!

首先要加標頭檔案:iomanip 一:setprecision   作用:控制輸出流顯示浮點數的數字個數,setprecision(n)就是輸出的n個數,會有四捨五入。 比如:double s=20.7843000, cout<<setprecisio

VC工程從Win32環境往Win64環境遷移的經驗總結'static_cast' (UINT)' to 'void (__cdecl CWnd::* )(UINT_PTR)'

其次在工程屬性設定中作如下修改: 1.  在“C/C++”——“前處理器”中將WIN32改為_WIN64,並且放在最前面,這樣才確保連結的是64位的Windows SDK。 2.  在“連結器”——“高階”——“目標計算機”將“MachineX86(/MACHINE:X8

自考總結網管、資料庫、軟工

準備時間 從暑假開始三科自考的學習到考試前一週,每天基本是2-3小時時間學習,除了每週一天的假期。考試那一週基本上一天的投入是5-7小時吧。 各階段學習 第一階段:快速閱讀,巨集觀把控,畫整體思維導圖。

golang常用加密解密演算法總結AES、DES、RSA、Sha1MD5

在專案開發過程中,當操作一些使用者的隱私資訊,諸如密碼、帳戶金鑰等資料時,往往需要加密後可以在網上傳輸。這時,需要一些高效地、簡單易用的加密演算法加密資料,然後把加密後的資料存入資料庫或進行其他操作;當需要讀取資料時,把加密後的資料取出來,再通過演算法解密。 關於加密解密 當前我們專案中常用