ORA-12899 修改資料庫字符集
儘量不要修改字符集
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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 修改資料庫字符集資料庫
- 修改Oracle資料庫字符集Oracle資料庫
- 修改資料庫字符集(轉)資料庫
- 修改Oracle資料庫字符集(zt)Oracle資料庫
- 怎樣修改資料庫字符集資料庫
- 「Oracle」資料庫字符集編碼修改Oracle資料庫
- Oracle修改資料字符集Oracle
- 如何在10g中修改資料庫字符集資料庫
- psycopg2 修改資料庫客戶端字符集資料庫客戶端
- 修改oracle9i資料庫字符集的方法(轉)Oracle資料庫
- ORACLE 修改資料庫的字符集編碼為UTF-8Oracle資料庫
- 資料庫字符集修改函式function nls_charset_id_name資料庫函式Function
- Oracle -- 字符集編碼'GBK'庫資料匯入到'UFT-8'庫中 大量報錯 ORA-12899 解決方案Oracle
- linux下mysql的預設字符集修改和預設資料庫引擎的修改LinuxMySql資料庫
- 資料庫修改資料資料庫
- 修改資料庫資料庫
- oracle資料庫字符集資訊Oracle資料庫
- 關於資料庫字符集資料庫
- oracle國家字符集與資料庫字符集Oracle資料庫
- [20130106]整和資料庫--修改字符集.txt資料庫
- oracle資料庫的字符集更改Oracle資料庫
- 檢視oracle資料庫字符集Oracle資料庫
- Oracle資料庫字符集介紹Oracle資料庫
- Oracle資料庫字符集問題Oracle資料庫
- Oracle資料庫字符集淺析Oracle資料庫
- 【實驗】【MySQL】模擬將latin1字符集的資料庫修改為gbk字符集MySql資料庫
- 轉載如何修改oracle資料庫字符集_及如何繞過超集報錯Oracle資料庫
- mysql修改表、欄位、庫的字符集MySql
- MySQL修改字符集(mysqldump轉換全庫)MySql
- Oracle資料庫字符集問題解析Oracle資料庫
- 巧妙轉換ORACLE資料庫字符集Oracle資料庫
- oracle資料庫字符集的轉換Oracle資料庫
- 資料庫字符集的選擇(轉)資料庫
- Oracle資料庫字符集分析之一Oracle資料庫
- 修改資料庫路徑資料庫
- 修改資料庫名稱資料庫
- 使用ALTER修改資料庫資料庫
- 如何修改資料庫例項及資料庫名資料庫