oracle修改字符集
生產(chǎn)環(huán)境的數(shù)據(jù)表用了 中文字段名。
在生產(chǎn)環(huán)境oracle表正常,新建開發(fā)環(huán)境時(shí),報(bào)字符串超長(zhǎng)。
原因是
生產(chǎn)oracle字符集是:NLS_CHARACTERSETZHS16GBK
開發(fā)oracle字符集是:NLS_CHARACTERSET AL16UTF16
開發(fā)oracle需要修改字符集和生產(chǎn)一致。
開發(fā)下:
select * from V$nls_Parameters;
cmd,sqlplus登錄
system as dba
密碼
通過 "alter database character set ZHS16GBK;" 方式修改,但并不總是有效。該命令在Oracle8時(shí)被引入Oracle,這個(gè)操作在本質(zhì)上并不轉(zhuǎn)換任何數(shù)據(jù)庫字符,只是簡(jiǎn)單的更新數(shù)據(jù)庫中所有跟字符集相關(guān)的信息。
查詢字符集信息: "SQL> select name,value$ from props$ where name like '%NLS%';",結(jié)果有二十行。
修改步驟:
注意:轉(zhuǎn)換字符集,數(shù)據(jù)庫應(yīng)該在RESTRICTED模式下進(jìn)行. (使用DBA登錄數(shù)據(jù)庫)
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
原因:
字符集超集問題,所謂超集是指:當(dāng)前字符集中的每一個(gè)字符在新字符集中都可以表示,并使用同樣的代碼點(diǎn),比如很多字符集都是US7ASCII的嚴(yán)格超集。如果不是超集,將獲得以上錯(cuò)誤。
解決方式:
SQL> alter database character set internal_use ZHS16GBK;
SQL> select * from v$nls_parameters;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
備注:
ALTER DATABASE CHARACTER SET操作的內(nèi)部過程是完全相同的,也就是說INTERNAL_USE提供的幫助就是使Oracle數(shù)據(jù)庫繞過了子集與超集的校驗(yàn)。該方法某些方面有用處,比如測(cè)試環(huán)境;應(yīng)用于產(chǎn)品環(huán)境大家應(yīng)該格外小心,除了你以外,沒有人會(huì)為此帶來的后果負(fù)責(zé)。
問題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
原因:
數(shù)據(jù)庫存在CLOB類型字段,那么就不允許對(duì)字符集進(jìn)行轉(zhuǎn)換
解決方式:
這時(shí)候,我們可以去查看alert.log日志文件,看CLOB字段存在于哪些表上:
內(nèi)容如:
ALTER DATABASE CHARACTER SET ZHS16GBK
SYS.METASTYLESHEET (STYLESHEET) - CLOB populated
ORA-12716 signalled during: ALTER DATABASE CHARACTER SET ZHS16GBK...
對(duì)于用戶表,可以先將該表導(dǎo)出,然后把該表刪掉,等字符轉(zhuǎn)換完畢后在導(dǎo)入。
-------------
更多的Java,Angular,Android,大數(shù)據(jù),J2EE,Python,數(shù)據(jù)庫,Linux,Java架構(gòu)師,:
http://www.cnblogs.com/zengmiaogen/p/7083694.html
總結(jié)
以上是生活随笔為你收集整理的oracle修改字符集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mybatis源码之缓存模块分析
- 下一篇: 成为项目经理需要具备什么条件?