修改Oracle資料庫字符集(zt)

zhouwf0726發表於2019-03-28

Character set字符集

英文:http://www.dbonline.cn

 

If the database has been created with the wrong character set, use the following to change the character set

UPDATE SYS.PROPS$

SET VALUES$ = 'WE8ISO8859P1'

WHERE NAME = 'NLS_CHARACTERSET';

It is VERY important to specify the character set name correctly. If the NLS_CHARACTERSET is updated to an invalid value, it will not then be possible to restart the database once it has been shutdown.

如果已經建立的資料庫使用了錯誤的字符集,你可以使用下面的方法修改字符集:

UPDATE SYS.PROPS$

SET VALUES$ = 'WE8ISO8859P1'

WHERE NAME = 'NLS_CHARACTERSET';

注意:確保字符集名稱的準確性是非常重要的。如果NLS_CHARACTERSET被更新成一個錯誤的值,資料庫關閉後就無法重新啟動了。

Update

―――――――――――――――――――――――――――――――――――――――

From version 8 you can now update the character set using the alter database command. An extract from the documentation is included below, the basic rule being that the new characterset must be a superset of the current set. Interestingly enough, I tried the above update with a characterset that violated that rule, it still works - of course, any character code differences will would inevitably cause some problems, so it would be safest to use the supported syntax.

Quote from the (8.1.6) documentation reveals:

Oracle8以後的資料庫可以通過使用alter database 命令修改字符集。引用文件中的一句話:新的字符集必須是原來字符集的一個超集。有意思的是,我曾經更新字符集是違反了這一原則,資料庫照樣工作;當然了,任何字元碼都可能導致同樣的問題,所以最安全的方法還是遵照規則辦事。

――――――――――――――――――――――――――――――――――――――

"Changing the Character Set After Database Creation

In some cases, you may wish to change the existing database character set. For instance, you may find that the number of languages that need to be supported in your database have increased. In most cases, you will need to do a full export/import to properly convert all data to the new character set. However, if and only if, the new character set is a strict superset of the current character set, it is possible to use the ALTER DATABASE CHARACTER SET to expedite the change in the database character set.

有時候,你可能需要修改當前資料庫的字符集。這時你會發現你需要增加資料庫支援的原因的種類。多數情況下,你可能需要通過完全的export/import匯入/匯出來實現。如果,僅僅是如果,新的字符集是當前字符集的一個嚴格的超集,使用ALTER DATABASE CHARACTER SET命令是一個可行的方法。

――――――――――――――――――――――――――――――――――――――

The target character set is a strict superset if and only if each and every codepoint in the source character set is available in the target character set, with the same corresponding codepoint value. For instance the following migration scenarios can take advantage of the ALTER DATABASE CHARACTER SET command since US7ASCII is a strict subset of WE8ISO8859P1, AL24UTFFSS, and UTF8:

Current Character Set New Character Set New Character Set is strict superset?

US7ASCII WE8ISO8859P1 yes

US7ASCII ALT24UTFFSS yes

US7ASCII UTF8 yes

如果A字符集中的每一個codepointB字符集中都有相同的有效值,那麼B字符集就可以成為A字符集的一個超集。例如,下面的遷移方案可以使用ALTER DATABASE CHARACTER SET命令,因為US7ASCIIWE8ISO8859P1, AL24UTFFSS UTF8的超集。

當前字符集                  新字符集              新字符集是否為超集

US7ASCII                    WE8ISO8859P1   

US7ASCII                    ALT24UTFFSS     

US7ASCII                    UTF8                     

 

 

 

WARNING: Attempting to change the database character set to a character set that is not a strict superset can result in data loss and data corruption. To ensure data integrity, whenever migrating to a new character set that is not a strict superset, you must use export/import. It is essential to do a full backup of the database before using the ALTER DATABASE [NATIONAL] CHARACTER SET statement, since the command cannot be rolled back. The syntax is:

ALTER DATABASE [] CHARACTER SET ;

ALTER DATABASE [] NATIONAL CHARACTER SET ;

 

 

 

The database name is optional. The character set name should be specified without quotes, for example:

ALTER DATABASE CHARACTER SET WE8ISO8859P1;

 

 

 

To change the database character set, perform. the following steps. Not all of them are absolutely necessary, but they are highly recommended:

SQL> SHUTDOWN IMMEDIATE; -- or NORMAL

 

 

 

SQL> STARTUP MOUNT;

SQL> ALTER SYSTEM ENABLE RESTRICED SESSION;

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

SQL> ALTER DATABASE OPEN;

SQL> ALTER DATABASE CHARACTER SET ;

SQL> SHUTDOWN IMMEDIATE; -- or NORMAL

SQL> STARTUP;

 

 

 

To change the national character set, replace the ALTER DATABASE CHARACTER SET statement with ALTER DATABASE NATIONAL CHARACTER SET. You can issue both commands together if desired."

警告:如果修改後的資料庫字符集不是當前字符集的一個超集,後果可能是資料丟失和資料錯誤。為了確保資料的完整性,修改字符集前一定要進行export/import匯出/匯入工作。在使用ALTER DATABASE [NATIONAL] CHARACTER SET命令修改資料庫字符集前,對資料庫進行完整的備份是十分必要的,因為這個命令導致的結果是無法通過回滾來恢復的。命令格式如下:

ALTER DATABASE [] CHARACTER SET ;

ALTER DATABASE [] NATIONAL CHARACTER SET ;

db_name是可選引數,new_character_set的值不能為空。例如

ALTER DATABASE CHARACTER SET WE8ISO8859P1;

在改變資料庫字符集之前進行一下操作,其中並不是決定必須的,但是強烈推薦進行如下操作:

SQL> SHUTDOWN IMMEDIATE; -- or NORMAL

 

 

 

SQL> STARTUP MOUNT;

SQL> ALTER SYSTEM ENABLE RESTRICED SESSION;

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

SQL> ALTER DATABASE OPEN;

SQL> ALTER DATABASE CHARACTER SET ;

SQL> SHUTDOWN IMMEDIATE; -- or NORMAL

SQL> STARTUP;

修改國家字符集使用命令ALTER DATABASE NATIONAL CHARACTER SET替換

ALTER DATABASE CHARACTER SET,需要的時候可以一起執行。

 

oracle字符集轉換分析工具

 

一、the Character Set Scanner Utility的作用
  分析字元資料轉換到新的字符集的可行性和可能存在的問題並給出一個評估報告,使用者可依據該報告確定如何進行字符集轉換。

  該工具主要測試在轉換到新的字符集時資料的字元編碼會作什麼改變;是否能成功轉換到新的字符集;轉換後的資料是否適合當前列的大小。只檢測CHAR, VARCHAR2, LONG, CLOB, NCHAR, NVARCHAR2, and NCLOB資料型別的列,不測試LONG, CLOB, and NCLOB資料型別的大小。
  
  二、工具的準備
  在使用前必須執行一個SQL指令碼CSMINST.SQL,該指令碼位於$oracle_home/rdbms/admin,只須執行一次,主要用於建立與掃描相關的一些資源。
  cd
  sqlplus system/manager
  SQL> start csminst.sql
  
  三、工具的執行
  執行掃描的使用者必須具備DBA許可權。在命令列下執行csscan,有三種執行方式:
  1、使用引數檔案 csscan system/manager PARFILE=filename
  2、命令列直接給出引數 csscan system/manager full=y tochar=zhs16gbk array=10240 process=3
  3、使用互動模式 csscan system/manager
  
  四、引數說明
  要獲得使用幫助在命令列下輸入 csscan help=y
  ARRAY:定義用於提取資料的buffer大小,該值決定掃描時每次讀取資料的行數,因此影響掃描時間的長短;如果char和varchar2列的大小之和大於該值,則每次讀取一行資料;如果包含LONG, CLOB, or NCLOB列則每次也只讀取一行。
  預設值:10240;最小值:4096;最大值:無限。
  BOUNDARIES:用於在生成應用資料包告時按列大小分組報告的分界值,例如設該值為(10,50,100),則在生成的評估報告中應用資料按char(1..10),char(11..50),char(51..100)分組列出,VARCHAR2, NCHAR, and NVARCHAR2 資料型別一樣。
  CAPTURE:確定是否獲取可轉換行的資訊到表CSM$ERRORS,主要用於選擇資料export/import到目標字符集。
  取值範圍:Y or N ,預設值:N。
  FEEDBACK:定義顯示掃描進度的每個點代表已掃描多少行。
  預設值:無;最小值:100;最大值:100000 。
  FROMCHAR:說明資料庫CHAR, VARCHAR2, LONG, CLOB資料型別的實際字符集,預設使用資料庫的字符集。
  FROMNCHAR:說明資料庫NCHAR, NVARCHAR2, NCLOB資料型別的實際國家字符集,預設使用資料庫的國家字符集。
  FULL:是否執行全資料庫掃描,如果是則掃描整個資料庫包括資料字典。
  取值範圍:Y or N ,預設值:N。
  HELP:顯示關於所有引數的幫助資訊。
  取值範圍:Y or N ,預設值:N。
  LASTRPT:指示是否產生基於上一次掃描的統計資訊上的掃描報告。
  取值範圍:Y or N ,預設值:N。
  LOG:產生報告的檔名,預設為scan;
  有三個檔案:掃描彙總報告scan.txt,獨立的例外報告scan.err,掃描日誌檔案scan.out。
  MAXBLOCKS:定義每個表的最大塊的大小,以便大表能分成小塊給某個掃描程式。
  預設值:無;最小值:1000;最大值:無限。
  PARFILE:指定引數檔案。
  PROCESS:定義併發掃描程式數。
  預設值:1;最小值:1;最大值:32。
  SUPPRESS:定義每個表的最大例外數,掃描記錄例外資訊到表CSM$ERRORS中,該引數限制記錄每個表最大的例外數。
  預設值:無限;最小值:0;最大值:無限。
  TABLE:指定掃描特定的表。
  TOCHAR:指定需要轉換的目標字符集。
  TONCHAR:指定需要轉換的目標國家字符集,如果未指定將不掃描NCHAR, NVARCHAR2, NCLOB資料型別的資料 。
  USER:指定要掃描的表的擁有者,如果未指定TABLE引數,則掃描該使用者所有表。
  USERID:執行掃描的使用者名稱和密碼(如不在本地還需要加上連線字串),未輸密碼,系統將會提示你輸入。
  
  五、掃描結果
  掃描將產生兩個結果報告:彙總報告和例外報告,彙總報告檔案字尾為.txt,例外報告檔案字尾為.err。
  彙總報告包括資料庫大小(每個表空間的大小和使用情況)、掃描引數、掃描總結、資料字典轉換總結、應用資料轉換總結、應用資料轉換按列大小總結、每張表可轉換資料分佈、每個列可轉換資料分佈、重建的索引。
  掃描總結依掃描模式可包含兩個內容:資料字典和應用資料;他們又分別有三種情況:所有資料保持不變、所有資料可以轉換、一些資料不可轉換。
  資料字典轉換總結和應用資料轉換總結分別對相應資料的可轉換情況按資料型別統計數量,其也分為三種情況:保持不變、可轉換、例外(不可轉換)。
  應用資料轉換按列大小總結同上,只是依據BOUNDARIES引數按列大小統計。
  每張表可轉換資料分佈和每個列可轉換資料分佈分別按表和按列統計可轉換資料和例外資料的分佈數量。
  重建的索引列出在import時能夠重建的索引。
  例外報告包括掃描引數和應用資料例外。
  應用資料例外列出所有例外資料(不能被轉換),以便這些資料在必要時進行修改。有兩種型別的例外:大小超出和損失轉換;大小超出指的是資料轉換為新的字符集後會比原來的字元寬;損失轉換的這些資料需在轉換前被修正合適新字符集或將被轉換為亂碼。

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

相關文章