转载自:http://www.eygle.com/index-ha.htm
Oracle XE 中的字符集的变换(转载+新增)
Oracle 10g Express Edition是Oracle专门为小型用户提供的免费版本。Oracle XE十分小巧,安装简单,可供第三方软件开发商部署较小的应用。
不过Oracle XE目前的beta2缺省安装的字符集是WE8MSWIN1252,不是中文字符集,并且不能通过直接运行 alter database character set ZHS16GBK ; 来修改,因为ZHS16GBK不是缺省字符集的超集。过去流传很广的直接修改sys用户下的PROPS$表的方法,也会给字符集的变更留下很多潜在的问题.
不过在安装完Oracle XE后,可以在sqlplus(即Oracle XE的run SQL command line)中, 进行如下的操作来修改字符集:
connect system/oracle9i as sysdba
shutdown immediate
startup mount
alter system enable restricted session ;
alter system set JOB_QUEUE_PROCESSES=0;
alter system set AQ_TM_PROCESSES=0;
alter database open ;
alter database character set internal_use ZHS16GBK ;
shutdown immediate
startup
或者改成: SIMPLIFIED CHINESE_CHINA.AL32UTF8
注意:这个时候还需要通过Regedit修改客户端的字符集。
并且,Oracle Home已经由于字符集的变换用不了,全是乱码。
不过,凑合能用就行。
我们又知道,通过ALTER DATABASE CHARACTER SET更改字符集虽然安全可靠,但是有严格的子集和超集的约束,实际上我们很少能够
用到这种方法。
实际上Oracle还存在另外一种更改字符集的方式.
如果你注意过的话,在Oracle的alert<sid>.log文件中,你可能看到过这样的日志信息:
alter database character set INTERNAL_CONVERT ZHS16GBK Updating character set in controlfile to ZHS16GBK SYS.SNAP$ (REL_QUERY) - CLOB representation altered SYS.METASTYLESHEET (STYLESHEET) - CLOB representation altered SYS.EXTERNAL_TAB$ (PARAM_CLOB) - CLOB representation altered XDB.XDB$RESOURCE (SYS_NC00027$) - CLOB representation altered ODM.ODM_PMML_DTD (DTD) - CLOB representation altered OE.WAREHOUSES (SYS_NC00003$) - CLOB representation altered PM.ONLINE_MEDIA (SYS_NC00042$) - CLOB representation altered PM.ONLINE_MEDIA (SYS_NC00062$) - CLOB representation altered PM.ONLINE_MEDIA (PRODUCT_TEXT) - CLOB representation altered PM.ONLINE_MEDIA (SYS_NC00080$) - CLOB representation altered PM.PRINT_MEDIA (AD_SOURCETEXT) - CLOB representation altered PM.PRINT_MEDIA (AD_FINALTEXT) - CLOB representation altered Completed: alter database character set INTERNAL_CONVERT ZHS1 |
在这里面,我们看到这样一条重要的,Oracle非公开的命令:
alter database character set INTERNAL_CONVERT/ INTERNAL_USE ZHS16GBK |
这个命令是当你选择了使用典型方式创建了种子数据库以后,Oracle会根据你选择的字符集设置,把当前种子数据库的字符集更改为期望字符
集,这就是这条命令的作用.
在使用这个命令时,Oracle会跳过所有子集及超集的检查,在任意字符集之间进行强制转换,所以,使用这个命令时你必须十分小心,你必须
清楚这一操作会带来的风险.
我们之前讲过的内容仍然有效,你可以使用csscan扫描整个数据库,如果在转换的字符集之间确认没有严重的数据损坏,或者你可以使用有效
的方式更改,你就可以使用这种方式进行转换.
我们来看一下具体的操作过程及Oracle的内部操作:
SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 135337420 bytes Fixed Size 452044 bytes Variable Size 109051904 bytes Database Buffers 25165824 bytes Redo Buffers 667648 bytes Database mounted. SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION; System altered. SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; System altered. SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0; System altered. SQL> ALTER DATABASE OPEN; Database altered. SQL> alter session set events '10046 trace name context forever,level 12'; Session altered. SQL> alter database character set INTERNAL_USE ZHS16CGB231280 Database altered. SQL> |
这是alert.log文件中的记录信息:
Tue Oct 19 16:26:30 2004
Database Characterset is ZHS16GBK
replication_dependency_tracking turned off (no async multimaster replication found)
Completed: ALTER DATABASE OPEN
Tue Oct 19 16:27:07 2004
alter database character set INTERNAL_USE ZHS16CGB231280
Updating character set in controlfile to ZHS16CGB231280
Tue Oct 19 16:27:15 2004
Thread 1 advanced to log sequence 118
Current log# 2 seq# 118 mem# 0: /opt/oracle/oradata/primary/redo02.log
Tue Oct 19 16:27:15 2004
ARC0: Evaluating archive log 3 thread 1 sequence 117
ARC0: Beginning to archive log 3 thread 1 sequence 117
Creating archive destination LOG_ARCHIVE_DEST_1: '/opt/oracle/oradata/primary/archive/1_117.dbf'
ARC0: Completed archiving log 3 thread 1 sequence 117
Tue Oct 19 16:27:20 2004
Completed: alter database character set INTERNAL_USE ZHS16CGB231280
Shutting down instance: further logons disabled
Shutting down instance (immediate)
License high water mark = 1
Tue Oct 19 16:29:06 2004
ALTER DATABASE CLOSE NORMAL
...
|
格式化10046跟踪文件,得到以下信息(摘要):
alter session set events '10046 trace name context forever,level 12' alter database character set INTERNAL_USE ZHS16CGB231280 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 4.88 6.04 910 16825 18099 0 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2 4.88 6.04 910 16825 18099 0 Misses in library cache during parse: 1 Optimizer goal: CHOOSE Parsing user id: SYS Elapsed times include waiting on following events: Event waited on Times Max. Wait Total Waited ---------------------------------------- Waited ---------- ------------ control file sequential read 4 0.00 0.00 control file parallel write 2 0.05 0.08 log file sync 2 0.08 0.08 SQL*Net message to client 1 0.00 0.00 SQL*Net message from client 1 18.06 18.06 ******************************************************************************** .... update col$ set charsetid = :1 where charsetform = :2 .... update argument$ set charsetid = :1 where charsetform = :2 .... update collection$ set charsetid = :1 where charsetform = :2 .... update attribute$ set charsetid = :1 where charsetform = :2 .... update parameter$ set charsetid = :1 where charsetform = :2 .... update result$ set charsetid = :1 where charsetform = :2 .... update partcol$ set spare1 = :1 where charsetform = :2 .... update subpartcol$ set spare1 = :1 where charsetform = :2 .... update props$ set value$ = :1 where name = :2 .... update "SYS"."KOTAD$" set SYS_NC_ROWINFO$ = :1 where SYS_NC_OID$ = :2 .... update seq$ set increment$=:2,minvalue=:3,maxvalue=:4,cycle#=:5,order$=:6, cache=:7,highwater=:8,audit$=:9,flags=:10 where obj#=:1 .... update kopm$ set metadata = :1, length = :2 where name='DB_FDO' .... ALTER DATABASE CLOSE NORMAL |
此处生成的日志你可以在这里下载(供参考):
http://www.eygle.com/special/primary_ora_13730.zip
http://www.eygle.com/special/primary_ora_13730.tkf.log
我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使
Oracle数据库绕过了子集与超集的校验.
这一方法在某些方面是有用处的,比如测试;应用于产品环境大家应该格外小心,除了你以外,没有人会为此带来的后果负责:
发表评论
-
JAVA调用存储过程(嵌套表)自定义类型例子
2010-03-09 14:53 28741. 建立type CREATE OR REPLACE ... -
如何启用sqlplus的AutoTrace功能
2010-01-11 23:26 967通过以下方法可以把Autotrace的权限授予Everyone ... -
oracle发送邮件
2010-01-11 23:24 1166CREATE OR REPLACE PACKAGE demo_ ... -
oracle常用查询
2010-01-10 09:31 1181oracle常用查询 oracle常用经典sql查询 ... -
toad相关
2010-01-10 09:29 2828toad相关 关键字: toad 9 ... -
oracle 导sequence命令
2010-01-08 17:52 1110select 'create sequence '||sequ ... -
oracle创建表空间和用户授权
2009-12-14 17:13 11101SYS用户在CMD下以DBA身份登陆: 在CMD中打sqlp ... -
关于ORACLE的ora-12505报错以及连接问题的解决及相关资料
2009-11-20 16:06 1711Error occured while trying to c ... -
SQL查询慢的48个原因分析
2009-09-16 16:21 911查询速度慢的原因很多 ...
相关推荐
不过Oracle XE目前的beta2缺省安装的字符集是WE8MSWIN1252,不是中文字符集,并且不能通过直接运行 alter database character set ZHS16GBK ; 来修改,因为ZHS16GBK不是缺省字符集的超集。过去流传很广的直接修改...
在Oracle 10g XE版本中,数据库默认安装时可能会采用一种特定的字符集(如ZHS16GBK),而这种字符集可能并不符合实际业务需求。例如,如果需要支持更多的国际字符或特殊符号,则可能需要将数据库字符集更改为AL32UTF...
Linux 下的 Oracle 数据库在导入数据库时出现中文乱码问题,这是因为 Oracle 数据库中的字符集格式不支持中文。解决方法是通过修改字符集格式,将其修改成支持中文的格式,这样可以正常显示中文字符。 Oracle ...
在Oracle数据库管理中,有时我们需要更改数据库的字符集以适应不同的语言环境或解决数据兼容性问题。本文将详细介绍如何修改Oracle数据库的字符集,并提供实际操作步骤。 #### 一、理解Oracle字符集 1. **字符集...
在C#编程环境中,开发人员可能遇到这种情况:应用程序的字符集设置为英文,但需要访问的Oracle数据库使用了中文字符集。在这种情况下,直接插入数据会导致乱码,因为数据的编码格式不匹配。为了解决这个问题,可以...
在Oracle数据库系统中,字符集(charset)是用于表示文本数据的编码方式。正确设置和管理字符集对于确保数据的一致性和正确性至关重要。Oracle支持多种字符集,包括单字节字符集(SBCS)、多字节字符集(MBSCS)以及...
Oracle数据库的字符集是决定数据库如何存储和处理字符数据的关键因素。在某些情况下,由于字符集不匹配,可能会导致数据导入导出时出现问题,比如提到的.dmp文件无法正常导入到其他数据库。针对这种情况,我们可以...
本文将深入探讨Oracle中的中文字符集问题,包括其基本概念、常见字符集类型以及如何在不同场景下正确配置和使用字符集。 #### 一、Oracle字符集概述 在Oracle环境中,字符集用于定义如何表示和存储字符数据。一个...
Oracle字符集是数据库管理系统Oracle中的一个重要概念,它决定了数据库如何存储和处理文本数据。字符集不仅影响着数据的准确性和一致性,还与全球化应用、数据迁移和数据交换密切相关。本篇将深入探讨Oracle字符集的...
本文将深入探讨如何解决OracleXE导入系统时缺少的包问题以及如何更改数据库的字符集。 首先,"导入系统缺少的包"可能指的是在执行数据泵导入(如`expdp`和`impdp`)或使用SQL*Loader等工具进行数据迁移时,发现某些...
在使用Oracle XE时,有时我们可能需要修改数据库的字符集以支持不同的语言或特殊字符。此外,随着应用程序的发展,升级Oracle Application Express (APEX)到最新版本也是必要的,以获取更多的功能和安全性更新。以下...
在Oracle数据库中,字符集定义了如何存储和显示字符。不同的数据库可能采用不同的字符集,如AL32UTF8(Unicode UTF-8编码)或WE8ISO8859P1(西欧语言的ISO 8859-1编码)。当从一个字符集迁移到另一个字符集时,必须...
Oracle XE(Express Edition)是Oracle数据库的一个精简版本,主要针对个人用户、小型企业和开发人员,提供了一个轻量级但功能强大的数据库解决方案。Oracle XE 11.2是Oracle数据库11g第二版的Express Edition,它...
在Oracle数据库的管理与维护过程中,字符集的正确设置对于确保数据的正确显示与处理至关重要。由于不同的地区和语言环境对于字符编码的需求各异,因此有时可能需要更改Oracle数据库的字符集设置。本文将详细介绍如何...
Oracle数据库系统支持多种字符集,以适应全球化的数据存储需求。字符集定义了数据库如何存储和显示字符,对于处理多语言环境尤为重要。在某些情况下,用户可能需要在客户端侧更改字符集,以便正确地显示或处理特定...
在Oracle数据库系统中,字符集是用来定义如何存储和显示字符的编码系统。Oracle支持多种字符集,包括中文和英文字符,以满足全球化的数据存储需求。然而,在处理包含多语言数据时,不同的字符集设置可能导致乱码问题...
专题中的"Oracle字符集(1).txt"可能涵盖了字符集的基本概念和分类,包括单字节字符集(如ASCII)和多字节字符集(如UTF8),以及如何通过NLS_LANG环境变量设置客户端字符集。 "Oracle字符集(2).txt"可能涉及...
在本案例中,远程 Oracle 数据库使用的字符集为 `AMERICAN_AMERICA.US7ASCII`,而本地 Oracle 数据库使用的字符集为 `SIMPLIFIED CHINESE_CHINA.ZHS16GBK`。这两种不同的字符集设置会导致数据在传输过程中出现乱码。...