ORA-12899 修改資料庫字符集

studywell發表於2016-06-17
儘量不要修改字符集
ORA-02374: ORA-12899:
初步估計為字符集差異導致.中文在UTF-8裡佔3個位元組,ZHS16GBK裡佔2個位元組
select * from V$NLS_PARAMETERS s where PARAMETER  like 'NLS%CHARACTERSET';
SQL> select * from V$NLS_PARAMETERS s where PARAMETER  like 'NLS%CHARACTERSET';

PARAMETER                                   VALUE
-------------------------------------------------------------
NLS_CHARACTERSET                     ZHS16GBK

NLS_NCHAR_CHARACTERSET     AL16UTF16



shutdown immediate;
STARTUP MOUNT;
ALTER SESSION SET SQL_TRACE=TRUE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;  ----記得調回去
ALTER SYSTEM SET AQ_TM_PROCESSES=0;   --這個引數預設就是0
ALTER DATABASE OPEN;
ALTER  DATABASE  CHARACTER  SET  INTERNAL_USE  ZHS16GBK;    ---報字符集不相容,此時用INTERNAL_USE指令不對字符集超集進行檢查
重啟資料庫後,可正常匯入;




通常會查詢NLS_CHARACTERSET(資料庫字符集),NLS_NCHAR_CHARACTERSET(國家字符集),應該要儲存多種語言,需要字符集為UTF-8。
檢視沒問題的DB裡 FieldA varchar2(10 char)
檢視有問題的DB裡 FieldA varchar2(10)
 
(沒出現問題之前還真沒注意到這兩種定義是有區別的。。。)
UTF-8裡一箇中文字元是3 bytes,從上面的定義可以看出來,如果char/byte 定義導致的可儲存資料長度相差很大了。
設定引數NLS_LENGTH_SEMANTICS可以在create table時對CHAR 或者VARCHAR2列指定使用位元組(byte)或者字元(character)來定義長度。
NCHAR, NVARCHAR2, CLOB, and NCLOB 列都是基於字元(character)的。
NLS_LENGTH_SEMANTICS不會影響到SYS和SYSTEM使用者表,資料字典定義都使用位元組(byte)。
可以在定義列時候顯示指定使用位元組(byte)或者字元(character)來定義長度:
CHAR(10 BYTE)  - 無論NLS_LENGTH_SEMANTICS設定成什麼,都使用位元組(byte)。
CHAR(10 CHAR) - 無論NLS_LENGTH_SEMANTICS設定成什麼,都使用字元(char)。



資料庫字符集和國家字符集區別


客戶端字符集
oracle@s11sp4x64:/orasoft/02_eicqmdb> echo $NLS_LANG
AMERICAN_AMERICA.zhs16gbk

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

相關文章