字符集问题的初步探讨(三)

来源:互联网 发布:js预加载页面动画 编辑:程序博客网 时间:2024/06/05 21:53
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

link:

http://www.eygle.com/special/NLS_CHARACTER_SET_03.htm

2.字符集的更改

 
创建以后,如果需要修改字符集,通常需要重建数据库,通过导入导出的方式来转换。
我们也可以通过以下方式更改





ALTERDATABASECHARACTERSET




注意:修改数据库字符集时必须谨慎,修改之前一定要为数据库备份。由于不能回退这项操作,因此可能会造成数据丢失或者损坏。

这是最简单的转换字符集的方式,但并不总是有效。
这个命令在8时被引入Oracle,这个操作在本质上并不转换任何数据库字符,只是简单的更新数据库中所有跟字符集相关的信息。

这意味着,你只能在新字符集是旧字符集严格超集的情况下使用这种方式转换。
所谓超集是指:
当前字符集中的每一个字符在新字符集中都可以表示,并使用同样的代码点
比如很多字符集都是US7ASCII的严格超集。

如果不是超集,将获得以下错误:



SQL>ALTERDATABASECHARACTERSETZHS16CGB231280;
ALTERDATABASECHARACTERSETZHS16CGB231280
*
ERRORatline1:
ORA-12712:newcharactersetmustbeasupersetofoldcharacterset


下面我们来看一个测试(以下测试在Oracle9.2.0下进行,Oracle9i较Oracle8i在编码方面有较大改变,在Oracle8i中,测试结果可能略有不同):

SQL>selectname,value$fromprops$wherenamelike'%NLS%';NAMEVALUE$------------------------------------------------------------NLS_LANGUAGEAMERICANNLS_TERRITORYAMERICANLS_CURRENCY$NLS_ISO_CURRENCYAMERICANLS_NUMERIC_CHARACTERS.,NLS_CHARACTERSETUS7ASCIINLS_CALENDARGREGORIANNLS_DATE_FORMATDD-MON-RRNLS_DATE_LANGUAGEAMERICAN……………….NLS_NCHAR_CHARACTERSETAL16UTF16NLS_RDBMS_VERSION9.2.0.4.020rowsselected.SQL>selectname,dump(name)fromeygle.test;NAMEDUMP(NAME)------------------------------------------------------测试Typ=1Len=4:178,226,202,212TestTyp=1Len=4:116,101,115,1162rowsselected.


转换字符集,数据库应该在RESTRICTED模式下进行.


 

c:/>sqlplus"/assysdba"SQL*Plus:Release9.2.0.4.0-ProductiononSatNov110:52:302003Copyright(c)1982,2002,OracleCorporation.Allrightsreserved.Connectedto:Oracle9iEnterpriseEditionRelease9.2.0.4.0-ProductionWiththePartitioning,OracleLabelSecurity,OLAPandOracleDataMiningoptionsJServerRelease9.2.0.4.0-ProductionSQL>shutdownimmediateDatabaseclosed.Databasedismounted.ORACLEinstanceshutdown.SQL>STARTUPMOUNT;ORACLEinstancestarted.TotalSystemGlobalArea76619308bytesFixedSize454188bytesVariableSize58720256bytesDatabaseBuffers16777216bytesRedoBuffers667648bytesDatabasemounted.SQL>ALTERSESSIONSETSQL_TRACE=TRUE;Sessionaltered.SQL>ALTERSYSTEMENABLERESTRICTEDSESSION;Systemaltered.SQL>ALTERSYSTEMSETJOB_QUEUE_PROCESSES=0;Systemaltered.SQL>ALTERSYSTEMSETAQ_TM_PROCESSES=0;Systemaltered.SQL>ALTERDATABASEOPEN;Databasealtered.SQL>setlinesize120SQL>ALTERDATABASECHARACTERSETZHS16GBK;ALTERDATABASECHARACTERSETZHS16GBK*ERRORatline1:ORA-12721:operationcannotexecutewhenothersessionsareactiveSQL>ALTERDATABASECHARACTERSETZHS16GBK;ALTERDATABASECHARACTERSETZHS16GBK*ERRORatline1:ORA-12716:CannotALTERDATABASECHARACTERSETwhenCLOBdataexists在Oracle9i中,如果数据库存在CLOB类型字段,那么就不允许对字符集进行转换SQL> 上一页 
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击