熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle數據庫字符集問題解決方案大全

2013-11-13 16:01:06  來源: Oracle 

  在國內外大中型數據庫管理系統中把ORACLE作為數據庫管理平台的用戶比較多ORACLE 不論是數據庫管理能力還是安全性都是無可非議的但是它在漢字信息的顯示方面著實給中國用戶帶來不少麻煩筆者多年從事ORACLE數據庫管理經常收到周圍用戶和外地用戶反映有關ORACLE數據庫漢字顯示問題的求援信主要現象是把漢字顯示為不可識別的亂碼造成原來大量信息無法使用本文將就這一問題產生的原因和解決辦法進行一些探討供存在這方面問題的用戶朋友參考
  
  原因分析
  通過對用戶反映情況的分析發現字符集的設置不當是影響ORACLE數據庫漢字顯示的關鍵問題那麼字符集是怎麼一會事呢?字符集是ORACLE 為適應不同語言文字顯示而設定的用於漢字顯示的字符集主要有ZHSCGBUSASCIIWEISOP字符集不僅需在服務器端存在而且客戶端也必須有字符集注冊服務器端字符集是在安裝ORACLE時指定的字符集登記信息存儲在ORACLE數據庫字典的V$NLS_PARAMETERS表中客戶端字符集分兩種情況一種情況是sql*net 以下版本字符集是在windows的系統目錄下的oracleini文件中登記的另一種情況是sql*net 以上(即位)版本字符集是在windows的系統注冊表中登記的要在客戶端正確顯示ORACLE 數據庫漢字信息首先必須使服務器端的字符集與客戶端的字符集一致其次是加載到ORACLE數據庫的數據字符集必須與服務器指定字符集一致因此把用戶存在的問題歸納分類產生漢字顯示異常的原因大致有以下幾種
  
   服務器指定字符集與客戶字符集不同而與加載數據字符集一致
  
  這種情況是最常見的只要把客戶端的字符集設置正確即可解決辦法見
  
   服務器指定字符集與客戶字符集相同與加載數據字符集不一致
  
  這類問題一般發生在ORACLE版本升級或重新安裝系統時選擇了與原來服務器端不同的字符集而恢復加載的備份數據仍是按原字符集卸出的場合以及加載從其它使用不同字符集的ORACLE數據庫卸出的數據的情況這兩種情況中不管服務器端和客戶端字符集是否一致都無法顯示漢字解決辦法見
  
  服務器指定字符集與客戶字符集不同與輸入數據字符集不一致
  
  這種情況是在客戶端與服務器端字符集不一致時從客戶端輸入了漢字信息輸入的這些信息即便是把客戶端字符集更改正確也無法顯示漢字解決辦法見
  
  .解決辦法
  下面將分別對上述三種情況給出解決辦法為了敘述方便假設客戶端使用WINDOWS/環境並已成功地配置了TCP/IP協議安裝了ORACLE的sql*netsql*pluse產品
  
   設置客戶端字符集與服務器端字符集一致
  
  假設當前服務器端使用USASCII字符集
  
  )查看服務器端字符集
  通過客戶端或服務器端的sql*plus登錄ORACLE的一個合法用戶執行下列
  SQL語句
  
  SQL > select * from V$NLS_PARAMETERS
  parameter value
  NLS_LANGUAGE AMERICAN
  NLS_TERRITORY AMERICA
  …
  NLS_CHARACTERSET USASCII
  NLS_SORT BINARY
  NLS_NCHAR_CHARACTERSET USASCII
  
  從上述列表信息中可看出服務器端ORACLE數據庫的字符集為USASCII
  
  )按照服務器端字符集對客戶端進行配置
  配置方法有兩種
  安裝ORACLE的客戶端軟件時指定
  在安裝ORACLE的客戶端產品軟件時選擇與ORACLE服務端一致的字符集(本例為USASCII)即可
  
  修改注冊信息的方法
  根據ORACLE 客戶端所選sql*net 的版本分為下列兩種情況
  
  a 客戶端為 sql*net 以下版本
  
  進入Windows的系統目錄編輯oracleini文件用USASCII替換原字符
  集重新啟動計算機設置生效
  
  b 客戶端為 sql*net 以上版本
  
  在WIN 下 運 行REGEDIT第一步選HKEY_LOCAL_MACHINE第二步選擇SOFTWARE 第三步選擇 ORACLE 第四步選擇 NLS_LANG 鍵 入 與服 務 器端 相 同 的 字 符 集(本例為AMERICAN_AMERICANUSASCII)
  
   強制加載數據字符集與服務器端字符集一致
  
  假設要加載數據從原ORACLE數據庫卸出時的字符集為USASCII當前ORACLE服務器字符集為WEISOP
  
  下面提供三種解決方法
  ) 服務器端重新安裝ORACLE
  在重新安裝ORACLE 時選擇與原卸出數據一致的字符集(本例為USASCII)
  
  加載原卸出的數據
  
  這種情況僅僅使用於空庫和具有同一種字符集的數據
  
  )強行修改服務器端ORACLE當前字符集
  在用imp命令加載數據前先在客戶端用sql*plus登錄system DBA用戶執行下列SQL語句進行當前ORACLE數據庫字符集修改
  
  SQL > create database character set USASCII
  * create database character set USASCII
  ERROR at line :
  ORA: insufficient privileges
  
  你會發現語句執行過程中出現上述錯誤提示信息此時不用理會實際上ORACLE數據庫的字符集已被強行修改為USASCII接著用imp命令裝載數據等數據裝載完成以後shutdown 數據庫再startup 數據庫用合法用戶登錄ORACLE數據庫在sql>命令提示符下運行select * from V$NLS_PARAMETERS可以看到ORACLE數據庫字符集已復原這時再查看有漢字字符數據的表時漢字已能被正確顯示
  
  )利用數據格式轉儲避開字符集限制
  這種方法主要用於加載外來ORACLE數據庫的不同字符集數據其方法如下
  
  先將數據加載到具有相同字符集的服務器上然後用轉換工具卸出為foxbase 格式或access格式數據庫再用轉換工具轉入到不同字符集的ORACLE數據庫中這樣就避免了ORACLE字符集的困擾目前數據庫格式轉換的工具很多象power builder以上版本提供的pipelineMicrosoft Access數據庫提供的數據導入/導出功能等轉換方法參見有關資料說明
  
  匹配字符集替換漢字
  
  對於提到的情況沒有很好的辦法只能先把客戶端與服務器端字符集匹配一致後根據原輸入漢字的特征碼替換漢字字符部分

From:http://tw.wingwit.com/Article/program/Oracle/201311/17682.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.