【nls_character】中文字元亂碼問題與字符集的修改

ballontt發表於2013-08-05

SYS@BALLONTT> select ASCIISTR('你好ab') from dual;

ASCIISTR(' ab')

--------------------------------

\FFFD\FFFD\FFFD\FFFD\FFFD\FFFDab

結果顯示中欄位的名字亂碼,字沒有了

 

首先,考慮系統的字符集

[oracle@bjr1p2 ~]$ echo $LANG

en_US.UTF-8

字符集為UTF-8,支援中文編碼

 

再來檢視資料庫字符集

SYS@BALLONTT> select * from v$nls_parameters

  2  where parameter='NLS_CHARACTERSET';

PARAMETER            VALUE

-------------------- --------------------

NLS_CHARACTERSET     US7ASCII

資料庫字符集為US7ASCII,此字符集雖然支援中文編碼,但是是使用了單位元組編碼。如果採用單位元組的字符集來儲存中文資訊,資料庫的字符集雖然是US7ASCII編碼,但裡面儲存的資料編碼實際上卻是另外的編碼格式,這種不一致的情況很容易引起問題,建議不要這樣使用。

那如果資料庫的字符集換成其他字符集(如雙位元組編碼的ZHS16GBK)還會出現這種問題嗎?

實驗一下便知道了,我仍然在此資料庫上進行實驗操作,所以將資料庫的字符集由US7ASCII更改為ZHS16GBK

(資料庫的字符集修改有兩種方法:1.將資料邏輯匯出,重新建庫,在匯入 2.使用命令直接修改。但是,資料庫字符集的修改可能會存在安全隱患,一般不建議進行直接修改)

 

資料庫字符集的修改:

SYS@BALLONTT> shutdown immediate;

SYS@BALLONTT> startup mount


SYS@BALLONTT> ALTER SESSION SET SQL_TRACE=TRUE;

Session altered.


SYS@BALLONTT> ALTER SYSTEM ENABLE RESTRICTED SESSION;

System altered.


SYS@BALLONTT> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

System altered.


SYS@BALLONTT> ALTER SYSTEM SET AQ_TM_PROCESSES=0;

System altered.


SYS@BALLONTT> alter database open;

Database altered.


SYS@BALLONTT>  ALTER DATABASE CHARACTER SET ZHS16GBK;

 ALTER DATABASE CHARACTER SET ZHS16GBK

*

ERROR at line 1:

ORA-12716: Cannot ALTER DATABASE CHARACTER SET when CLOB data exists

如果報錯,執行如下語句跳過檢查:

SYS@BALLONTT> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;

Database altered.

 

重啟

SYS@BALLONTT> shutdown immediate;

SYS@BALLONTT> startup

 

檢視資料庫字符集

SYS@BALLONTT> select * from v$nls_parameters

  2  where parameter='NLS_CHARACTERSET';

PARAMETER               VALUE

--------------------      --------------------

NLS_CHARACTERSET     ZHS16GBK

已經修改為ZHS16GBK


再來測試一下漢字的插入

SYS@BALLONTT> select ASCIISTR('你好') from dual;

ASCIISTR('你好')

\6D63\72B2\30BD

沒有任何問題


ballontt

2013/8/6

---The End---

如需轉載,請標明出處和連結,大謝!

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27425054/viewspace-767861/,如需轉載,請註明出處,否則將追究法律責任。

相關文章