今天我们来聊一下如何在Oracle 11g中修改字符集。在日常工作中,由于数据来源的不同,有时候需要将一个数据库的字符集改为另一个字符集,这时候我们就需要修改Oracle数据库的字符集。下面我们就来详细的了解一下Oracle 11g修改字符集的方法。
首先,我们需要了解一下Oracle字符集的基础知识。Oracle的字符集是由两部分组成的:一部分是NLS_LANG参数,一部分是数据库的数据库实例字符集。其中NLS_LANG指的是Oracle客户端的字符集,也就是说,当我们从Oracle数据库中读取数据时,必须使用NLS_LANG指定的字符集来读取。而数据库实例字符集是用来指定数据库中的字符集,通常情况下,它和操作系统的字符集是一致的。
接下来,我们就来看一下如何修改Oracle 11g的字符集。假设我们需要将一个已有的数据库的字符集由US7ASCII改为UTF8。我们需要先创建一个新的数据库实例,而不是直接去修改已有的数据库实例。
[oracle@server bin]$ sqlplus sys as sysdba SQL>shutdown immediate; SQL>startup mount; SQL>alter system enable restricted session; SQL>alter database backup controlfile to trace; SQL>exit;
在切换到Oracle账号后,首先我们进行了数据库的Shutdown操作,接着启动数据库实例,创建一个受限制的会话,最后备份了control file,以便我们之后的操作出了问题可以恢复。接下来,我们就需要创建一个新的数据目录并复制数据到这个目录下,以备迁移新的数据库实例。在创建目录后,我们将之前备份的control file拷贝到目录下,然后修改init.ora文件,将其中的部分参数修改为如下所示:
#Set the new characterset NLS_CHARACTERSET=AL32UTF8 #Disable CHARSETFORMCHK NLS_NCHAR_CONV_EXCP=false #Set the new National characterset. Needed only if dealing with NVARCHAR2s NLS_NCHAR_CHARACTERSET=AL16UTF16
其中,NLS_CHARACTERSET参数指定了数据库实例的新字符集,AL32UTF8是UTF8的ORACLE实现方式;NLS_NCHAR_CONV_EXCP参数告诉ORACLE不要对字符集转换抛出异常;NLS_NCHAR_CHARACTERSET参数则指定了National characterset的字符集类型。
修改完init.ora文件后,我们就需要将所有的表空间以及数据文件存储在我们新的数据目录之下,也就是说,我们需要重新创建数据文件并将原有数据文件中的数据移动到新建的文件中。在完成数据文件的迁移后,我们就可以打开数据库实例了:
SQL>alter database open;最后,我们需要进行DBMS_METADATA包更新,以保证对新字符集的支持。我们需要使用已经迁移的数据库帐户登录到SQL>PLUS中,然后执行以下命令:
SQL>EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', false); SQL>EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'PRETTY', false); SQL>EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'SQLTERMINATOR', true);这些命令将会修改DBMS_METADATA包的一些参数,以便正常支持新的字符集。现在,我们已经完成了全套Oracle 11g修改字符集的操作,接下来就可以愉快的使用新的字符集了。
总结:Oracle 11g修改字符集需要比较繁琐的步骤,需要我们谨慎处理每一个步骤。但只要操作正确,我们就可以成功迁移数据到新的字符集,从而达到我们修改字符集的目的。希望这篇文章可以帮到你。
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did253921