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