出現中文亂碼的主要原因是字符集不同。
在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...