Oracle 亂碼問題

2021-09-18 00:14:44 字數 2103 閱讀 2110

出現中文亂碼的主要原因是字符集不同。

在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字符集後,一般的亂碼問題應該解決掉了。

Oracle中文亂碼問題

select userenv language from dual 實際檢視到的結果為 simplified chinese china.al32utf8 檢視第一行中parameter項中為nls language 對應的value項中是否和第一步得到的值一樣。如果不是,需要設定環境變數.否則pl...

Oracle亂碼的問題

1.sql指令碼直接能執行但是以sql檔案不能執行 sql正常,由txt轉換為sql檔案後,資料庫執行報錯,解決辦法是將sql檔案中資料取出放到新檔案中,新檔案儲存時直接以sql格式儲存。2.亂碼問題 1.如果匯入到plsql中顯示亂碼,首先檢視sql的儲存格式,修改成utf 8 2.檢視伺服器端編...

ORACLE亂碼問題的解決

使用sqlplus連線oracle資料庫的時候,老是出現?一類的字元,主要是因為 伺服器和客戶端語言設定不相同。日文環境下 伺服器端的設定為 ja16sjis,客戶端沒有作設定就出現了上述現象。請將環境變數設值為 csh setenv nls lang american japan.ja16sjis...