- 論壇徽章:
- 0
|
==oracle 數(shù)據(jù)庫 NLS_CHARACTERSET 字符集的修改== 修改Oracle 數(shù)據(jù)庫字符集總結(jié): 修改方式大約有3種: 方法一: (最安全的方法) 數(shù)據(jù)庫創(chuàng)建以后,如果需要修改字符集,通常需要重建數(shù)據(jù)庫,通過導入導出的方式來轉(zhuǎn)換。 方法二: (最常用的方法) 通過 "alter database character set ZHS16GBK;" 方式修改,但并不總是有效。該命令在Oracle8時被引入Oracle,這個操作在本質(zhì)上并不轉(zhuǎn)換任何數(shù)據(jù)庫字符,只是簡單的更新數(shù)據(jù)庫中所有跟字符集相關的信息。(意味,你只能在新字符集是舊字符集嚴格超集的情況下使用這種方式轉(zhuǎn)換。) 方法三: (最不安全的方法) 修改SYS.props$表,使用"update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';" 方式更改字符集時候,只是修改了 props$ 表,只完成了十幾的十二分之一的內(nèi)容,存在數(shù)據(jù)完整性的隱患。(value$值輸入了不正確的字符集,后果可能導致數(shù)據(jù)庫無法啟動。) 只對更改后的數(shù)據(jù)有效,即數(shù)據(jù)庫中原來的數(shù)據(jù)仍以原字符集被存儲。
注意: 1.修改數(shù)據(jù)庫字符集時必須謹慎,修改之前一定要做數(shù)據(jù)庫全量備份。(由于不能回退該項操作,因此可能會造成數(shù)據(jù)丟失或者損壞。) 2.使用 "alter database character set ZHS16GBK;" 方式更改字符集時候,至少需要更改12張數(shù)據(jù)字典表; 3.使用"update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';" 方式更改字符集時候,只是修改了 props$ 表,只完成了十幾的十二分之一的內(nèi)容,存在數(shù)據(jù)完整性的隱患。因此,更改字符集盡量使用正常的途徑。 4.設置 sql_trace 跟著后臺操作:在 mount 模式(SQL> STARTUP MOUNT;)下面,把會話修改為trace模式(SQL> ALTER SESSION SET SQL_TRACE=TRUE;),可以跟著數(shù)據(jù)庫的后臺操作。(sql_trace是DBA的常用利器之一) 5.實際上當我們更新了字符集,數(shù)據(jù)庫啟動時會根據(jù)數(shù)據(jù)庫的字符集自動的來修改控制文件的字符集,如果字符集可以識別,更新控制文件字符集等于數(shù)據(jù)庫字符集;如果字符集不可識別,那么控制文件字符集更新為US7ASCII。通過更新props$表的方式修改字符集,在Oracle7之后就不應該被使用.
本節(jié)重點解釋方法二: 通過 "alter database character set ZHS16GBK;" 方式修改,但并不總是有效。該命令在Oracle8時被引入Oracle,這個操作在本質(zhì)上并不轉(zhuǎn)換任何數(shù)據(jù)庫字符,只是簡單的更新數(shù)據(jù)庫中所有跟字符集相關的信息。 查詢字符集信息: "SQL> select name,value$ from props$ where name like '%NLS%';",結(jié)果有二十行。 修改步驟: 注意:轉(zhuǎn)換字符集,數(shù)據(jù)庫應該在RESTRICTED模式下進行. (使用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 原因: 字符集超集問題,所謂超集是指:當前字符集中的每一個字符在新字符集中都可以表示,并使用同樣的代碼點,比如很多字符集都是US7ASCII的嚴格超集。如果不是超集,將獲得以上錯誤。 解決方式: 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ù)庫繞過了子集與超集的校驗。該方法某些方面有用處,比如測試環(huán)境;應用于產(chǎn)品環(huán)境大家應該格外小心,除了你以外,沒有人會為此帶來的后果負責。
問題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類型字段,那么就不允許對字符集進行轉(zhuǎn)換 解決方式: 這時候,我們可以去查看alert<sid>.log日志文件,看CLOB字段存在于哪些表上: 內(nèi)容如: ALTER DATABASE CHARACTER SET ZHS16GBK SYS.METASTYLESHEET (STYLESHEET) - CLOB populated ORA-12716 signalled during: ALTER DATABASE CHARACTER SET ZHS16GBK... 對于用戶表,可以先將該表導出,然后把該表刪掉,等字符轉(zhuǎn)換完畢后在導入。
例子1: SQL> select name,value$ from props$ where name like '%NLS%'; NAME VALUE$ ------------------------------ -------------------------------------------------------------------------------- NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS ., NLS_CHARACTERSET ZHS16GBK NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY NLS_TIME_FORMAT HH.MI.SSXFF AM NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR NLS_DUAL_CURRENCY $ NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_RDBMS_VERSION 11.1.0.6.0 20 rows selected SQL>
例子2: SQL> ALTER SESSION SET SQL_TRACE=TRUE; Session altered. SQL> ALTER DATABASE CHARACTER SET ZHS16GBK; Database altered. SQL> ALTER SESSION SET SQL_TRACE=FALSE; Session altered.
|
|