生產環境的數據表用了 中文字段名。
在生產環境oracle表正常,新建開發環境時,報字符串超長。
原因是
生產oracle字符集是:NLS_CHARACTERSETZHS16GBK
開發oracle字符集是:NLS_CHARACTERSET AL16UTF16
開發oracle需要修改字符集和生產一致。
開發下:
select * from V$nls_Parameters;
cmd,sqlplus登錄
system as dba
密碼
通過 "alter database character set ZHS16GBK;" 方式修改,但并不總是有效。該命令在Oracle8時被引入Oracle,這個操作在本質上并不轉換任何數據庫字符,只是簡單的更新數據庫中所有跟字符集相關的信息。
查詢字符集信息: "SQL> select name,value$ from props$ where name like '%NLS%';",結果有二十行。
修改步驟:
注意:轉換字符集,數據庫應該在RESTRICTED模式下進行. (使用DBA登錄數據庫)
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER SESSION SET SQL_TRACE=TRUE;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> set linesize 120;
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
常見問題:
問題1:
SQL> ALTER DATABASE CHARACTER SET ZHS16CGB231280;
ALTER DATABASE CHARACTER SET ZHS16CGB231280
*
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set
原因:
字符集超集問題,所謂超集是指:當前字符集中的每一個字符在新字符集中都可以表示,并使用同樣的代碼點,比如很多字符集都是US7ASCII的嚴格超集。如果不是超集,將獲得以上錯誤。
解決方式:
SQL> alter database character set internal_use ZHS16GBK;
SQL> select * from v$nls_parameters;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
備注:
ALTER DATABASE CHARACTER SET操作的內部過程是完全相同的,也就是說INTERNAL_USE提供的幫助就是使Oracle數據庫繞過了子集與超集的校驗。該方法某些方面有用處,比如測試環境;應用于產品環境大家應該格外小心,除了你以外,沒有人會為此帶來的后果負責。
問題2:
ALTER DATABASE CHARACTER SET ZHS16GBK
*
ERROR at line 1:
ORA-12721: operation cannot execute when other sessions are active
原因:
字符集超集問題。
解決方式:
SQL> alter database character set internal_use ZHS16GBK;
SQL> select * from v$nls_parameters;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
問題3:
SQL> 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
原因:
數據庫存在CLOB類型字段,那么就不允許對字符集進行轉換
解決方式:
這時候,我們可以去查看alert.log日志文件,看CLOB字段存在于哪些表上:
內容如:
ALTER DATABASE CHARACTER SET ZHS16GBK
SYS.METASTYLESHEET (STYLESHEET) - CLOB populated
ORA-12716 signalled during: ALTER DATABASE CHARACTER SET ZHS16GBK...
對于用戶表,可以先將該表導出,然后把該表刪掉,等字符轉換完畢后在導入。
-------------
更多的Java,Angular,Android,大數據,J2EE,Python,數據庫,Linux,Java架構師,:
http://www.cnblogs.com/zengmiaogen/p/7083694.html