1818IP-服务器技术教程,云服务器评测推荐,服务器系统排错处理,环境搭建,攻击防护等

当前位置:首页 - 数据库 - 正文

君子好学,自强不息!

我们大家都知道Oracle字符集是具有互相包容性的。例如,us7ascii是zhs16gbk的子集,us7ascii到zhs16gbk不会有相关的数据解释上的一些问题,是不会出现数据丢失的。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。

一旦数据库创建后,数据库的字符集理论上讲是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集十分重要。根据Oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么Oracle字符集的转换是不受Oracle支持的。

对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改Oracle数据库server端的字符集。

特别说明,我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种Oracle字符集之间的相互转换不受支持。

修改server端字符集(不建议使用)

在Oracle 8之前,可以用直接修改数据字典表props$来改变数据库的Oracle字符集。但Oracle8之后,至少有三张系统表记录了数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。正确的修改方法如下:

$sqlplus/nolog 
SQL>conn/assysdba;  

若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:

SQL>STARTUPMOUNT; 
SQL>ALTERSYSTEMENABLERESTRICTEDSESSION; 
SQL>ALTERSYSTEMSETJOB_QUEUE_PROCESSES=0; 
SQL>ALTERSYSTEMSETAQ_TM_PROCESSES=0; 
SQL>ALTERDATABASEOPEN; 
SQL>ALTERDATABASECHARACTERSETZHS16GBK; 
SQL>ALTERDATABASEnationalCHARACTERSETZHS16GBK; 
SQL>SHUTDOWNIMMEDIATE; 
SQL>STARTUP 

注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的Oracle字符集必须是Oracle支持,不然不能start) 按上面的做法就可以,但是可能会出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 这样的提示信息

要解决这个问题有两种方法

一个是,利用INTERNAL_USE 关键字修改区域设置,

还有一个是利用re-create,但是re-create有点复杂,所以请用internal_use,

SQL>SHUTDOWNIMMEDIATE; 
SQL>STARTUPMOUNTEXCLUSIVE; 
SQL>ALTERSYSTEMENABLERESTRICTEDSESSION; 
SQL>ALTERSYSTEMSETJOB_QUEUE_PROCESSES=0; 
SQL>ALTERSYSTEMSETAQ_TM_PROCESSES=0; 
SQL>ALTERDATABASEOPEN; 
SQL>ALTERDATABASENATIONALCHARACTERSETINTERNAL_USEUTF8; 
SQL>SHUTDOWNimmediate; 
SQL>startup; 

如果按上面的做法做,National charset的区域设置就没有问题

本文来源:1818IP

本文地址:https://www.1818ip.com/post/11654.html

免责声明:本文由用户上传,如有侵权请联系删除!

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。