Oracle資料庫中文亂碼

2021-07-15 19:57:32 字數 3590 閱讀 5625

字符集是oracle為適應不同語言文字顯示而設定的。用於漢字顯示的字符集主要有zhs16cgb231280、zhs16gbk、us7ascii和utf-8等。字符集同時存在於伺服器端和客戶端。伺服器端字符集是在安裝oracle時指定的,字符集登記資訊儲存在oracle資料庫字典的v$nls_parameters表中;而客戶端字符集是在系統登錄檔(windows系統)或在使用者的環境變數(unix系統)中設定的。

字符集的構成與設定

字符集的構成與設定方式分為客戶端與伺服器端兩種:

(1)客戶端字符集的構成與設定。客戶端的字符集是由當前使用者的環境變數nls_lang設定的。環境變數nls_lang的構成:nls_lang=language_territory.charset

其中:language 指定伺服器訊息的語言

territory   指定伺服器的日期和數字格式

charset    指定字符集

三個成分可以任意組合,例如:

american_america.us7scii

simplified chinese_china.zhs16gbk

american_america.zhs16gbk

客戶端字符集的設定方法針對不同作業系統設定方法稍有不同:

windows系統是在登錄檔項:hkey_local_machine/software/oracle/home0/nls_lang中設定;

unix系統是在當前使用者的環境變數中設定,如在當前使用者的profile檔案中增加一行如下**:

nls_lang=simplified chinese_china.zhs16gbk;export nls_lang

(2)服務端字符集的構成與設定。服務端字符集的構成體現在資料字典表v$nls_parameters的nls_language、nls_territory、nls_characterset三項取值上,其中nls_characterset的取值就是具體的資料庫字符集。如利用查詢語句sql>select * from v$nls_parameters;可得到如下結果:

parameter                   value

nls_language           simplified chinese

nls_territory               china

nls_characterset           zhs16gbk

即當前資料庫使用的字符集是zhs16gbk。

資料庫服務端的字符集是在建立資料時設定的。但可通過如下方法對已設定的字符集進行修改:

方法一:重建資料庫。建立資料庫時將資料庫的字符集設定為所需字符集。

方法二:修改sys.props$表。即用sys使用者登陸oracle後,利用下面語句修改相應的字符集並提交:sql>update props$ set value$=』zhs16gbk『where name=』nls_characterset』;sql>commit;

通過此種方法來更改資料庫字符集,只對更改後的資料有效,即資料庫中原來的資料仍以原字符集被儲存。

另外,有的還利用create database character set zhs16gbk命令暫時的修改字符集,當重啟資料庫後,資料庫字符集將恢復原來的字符集。

4 常見的漢字亂碼問題及解決方案

要在客戶端正確顯示oracle資料庫中的漢字資訊,首先必須使客戶端的字符集與伺服器端的字符集一致;其次是載入到oracle資料庫的資料字符集必須與伺服器字符集一致。據此,漢字顯示亂碼的問題大致可以分為以下幾種情況:

(1)客戶端字符集與伺服器端字符集不同,伺服器端字符集與載入資料字符集一致。這種情況是最常見的,只要把客戶端的字符集設定正確即可。具體解決方案:

第一步:查詢v$nls_parameters得到服務端的字符集:sql>select * from v$nls_parameters;

parameter                       value

nls_language            simplified chinese

nls_territory                   china             

nls_characterset              zhs16gbk   

第二步:根據服務端的字符集設定客戶端的字符集,設定方法參見客戶端的字符集的設定方式。以unix系統為例,可在當前使用者的profile檔案中增加如下兩行:

nls_lang=simplified chinese_china.zhs16gbk    export nls_lang

(2)客戶端字符集與伺服器端字符集相同,伺服器端字符集與載入資料字符集不一致。這種情況一般發生在oracle版本公升級或重新安裝資料庫時選擇了與原來資料庫不同的字符集,而恢復載入的備份資料仍是按原字符集卸出的場合。另一種情況是載入從其它使用不同字符集的oracle資料庫卸出的資料。在這兩種情況中,不管客戶端字符集與伺服器端字符集是否一致都無法正確顯示漢字。具體解決方案:

方案一:按服務端字符集的修改方法修改服務端字符集與載入資料字符集一致,然後匯入資料。

方案二:利用資料格式轉儲,避開字符集帶來的問題。即先將載入資料倒入到與其字符集一致的資料庫中,然後再將資料要麼按文字格式匯出(資料量較小的情況下),要麼通過第三方工具(如power builder,access,foxpro等)倒出資料,最後將倒出的資料匯入到目標資料庫中。

(3)客戶端字符集與伺服器端字符集不同,服務端字符集與輸入資料字符集不同。這種情況是在客戶端字符集與伺服器端字符集不一致時,從客戶端輸入了漢字資訊。輸入的這些資訊即便是把客戶端字符集更改正確,也無法顯示漢字。解決方案:修改客戶端字符集與服務端字符集一致後,重新輸入資料。

oracle伺服器內部的字符集

這是oracle資料庫儲存資料使用的字符集。

在oracle中可能使用

select userenv('language') from dual;

或者:select name, value$ from props$;

檢視。

nls_lang變數裡儲存的字符集

這個是oracle設定的乙個變數。

在windows中,這個變數儲存在登錄檔中:

hkey_local_machine/software/oracle/home0

儲存著nls_lang變數。

在unix/linux中,則需要自己進行設定了。我本人是在.profile裡面加上

nls_lang=american_america.zhs16gbk

export nls_lang

客戶端應用的字符集

使用oracle裡資料或者向oracle提供資料的應用程式。

如果 oracle伺服器內部的字符集 和 nls_lang變數裡儲存的字符集 相同,在進行oracle查詢時,就會將oracle中的資料直接查出來,返回給查詢使用者。進行oracle的插入操作,就會直接將插入的資料儲存進資料庫中。

但是如果不同的話,oracle查詢時,會根據這兩個字符集的乙個對映,將資料庫中的資料作乙個轉換,再返回給查詢使用者。進行插入操作時,也會根據對映,將插入的資料作乙個轉換,再插入資料庫。這也是產生亂碼的原因,這一層轉換,把資料都給轉亂了。

原址:

原址:

解決oracle資料庫中文亂碼問題

中文亂碼問題解決 1.檢視伺服器端編碼 select userenv language from dual 我實際查到的結果為 american america.zhs16gbk 2.執行語句 select from v nls parameters 檢視第一行中parameter項中為nls la...

PLSQL 操作oracle資料庫中文亂碼

步驟一 開始 執行 輸入regedit 回車進入登錄檔,依次單擊hkey local machine software oracle key oradb11g home1 不同版本的oracle顯示的都不太一樣,但都會包含home這個單詞 找到 nls lang 檢視數值資料是否為 simplifi...

mysql資料庫 中文亂碼

參考文章 本文有些長情況複雜,可直接看最下面 8 總結 解決方案 1.mysql資料庫中文顯示亂碼 命令列中也是 在sqlyog裡面顯示?在命令列也顯示?2.命令 show variables like character 從上圖中可以看到 mysql 有六處使用了字符集,分別為 client co...