Oracle漢字亂碼問題原因及解決方法

2021-04-23 04:11:05 字數 2154 閱讀 3885

在oracle中,我們關心三個地方的字符集:

l oracle伺服器內部的字符集

l nls_lang變數裡儲存的字符集

l 客戶端應用的字符集

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查詢時,會根據這兩個字符集的乙個對映,將資料庫中的資料作乙個轉換,再返回給查詢使用者。進行插入操作時,也會根據對映,將插入的資料作乙個轉換,再插入資料庫。這也是產生亂碼的原因,這一層轉換,把資料都給轉亂了。

解決辦法:

將資料庫的字符集和nls_lang字符集設定的一樣,就可以避免亂碼的出現了。

修改資料庫字符集的步驟如下:

1、擁有修改許可權(用管理使用者登入)。

sql> conn sys/sys as sysdba;

2、關閉資料庫。

sql>shutdown immediate;

3、啟動資料庫到mount狀態下。

sql> startup mount;

oracle instance started.

total system global area 76619308 bytes

fixed size 454188 bytes

variable size 58720256 bytes

database buffers 16777216 bytes

redo buffers 667648 bytes

database mounted.

sql> alter session set sql_trace=true;

session altered.

sql> alter system enable restricted session;

system altered.

sql> alter system set job_queue_processes=0;

system altered.

sql> alter system set aq_tm_processes=0;

system altered.

4、啟動資料庫

sql> alter database open;

5、修改字符集

sql> alter database character set zhs16gbk;

注:1. 如果資料庫表中有clob型別的列,是不允許修改字符集的,解決方法為,先導出這個表的內容,然後刪除這個表,修改完後,再匯入這個表的內容就可以了。

2. 舊的字符集必須是新的字符集的子集,否則不能修改。

修改完後,可以檢視一下修改是否成功。

6、關閉資料庫

sql> shutdown immediate;

7、重新啟動資料庫

sql> startup;

經過設定完oracle字符集後,一般的亂碼問題應該解決掉了。

在開發中,還遇到了這樣乙個問題:

資料庫伺服器和應用伺服器都佈署在solaris上面了,建庫的指令碼也是在solaris上面執行的,在solaris上面查詢資料是正常的,但是在windows上用瀏覽器看時,就會變成?了。

這個問題的解決辦法是,將資料庫建庫指令碼在windows上執行,再檢視就都變正常了

CAD漢字亂碼問題

如何設定cad可以把gbcbig作為缺失字型的替換字型 怎樣在cad中快速替換缺失字型 cad支援兩種字型 解決辦法 出現選擇字型對話方塊不用管它,直接關閉。文字顯示 時,按如下操作 1 文字顯示 時,選擇有問題的文字,ctrl 1檢視文字樣式名稱記下來,2 命令style開啟文字樣式對話方塊,找到...

Qt漢字亂碼問題

1.漢字亂碼問題 例 ui editdebugchannel settext qstring 1通道 arg debug channel 顯示到視窗就會有亂碼 產生原因 qt內部是使用unicode編碼的,即qstring儲存的是unicode編碼的字串。而原始碼中的漢字字串在生成可執行檔案的過程中...

亂碼問題本質原因

當中文被讀取成無法識別的字元時被稱為亂碼 檔案在儲存時是有編碼格式的,只有當儲存時使用的編碼格式與讀取時使用的編碼格式相同時才能正確讀取檔案 例如utf 8編碼 gbk編碼都可以讀取中文,那麼如果採用utf 8編碼儲存檔案,但是採用gbk編碼讀取檔案就會造成亂碼,因此utf 8編碼儲存的檔案應該使用...