如何修改oracle 9i 10g 11g9i字符集为oracle 9i 10g 11g11g字符集

字符集与Oracle导出导入问题总结_数据库技术_Linux公社-Linux系统门户网站
你好,游客
字符集与Oracle导出导入问题总结
来源:Linux社区&
作者:liaojiabo
一 字符集与导出导入问题总结
&& &首先是必须保证的数据库服务端与客户端字符集一致,这样就能保证数据编码的一致性。
当数据库服务端选用ZHS16GBK时,当导出导入新的数据过程中,数据库服务端会对导入的二进制数据库作ZHS16GBK编码检查,当数据长度为奇数值时,出现数据的最后一个字节对应十进制为:129到254时,会丢失此字节,具体解释见第二节内容。
当数据库服务端选用WE8ISO8859P1时,当导出导入新的数据过程中,数据库服务端会对导入的二进制数据库作WE8ISO8859P1编码检查,逐个字节内容进行,不会有数据丢情况发生,具体解释见第二节内容;
针对在不同的字符集下将密文表数据进行导出导入后会有数据丢失的情况,下面作详细描述。
二 ZHS160GBK与WE8ISO8859P1字符集说明
对于上面提到的两种字符集,ZHS16GBK是Windows系统安装Oracle时,默认的数据库字符集,WE8ISO8859P1是Linux系统的默认安装的数据库字符集。且两种字符集都支持中文,至于国家字符集的选择,这里我们都是选择AF16UTF16。数据库安装完成后,可以用 select userenv('language') from dual 语句进行查看。对于ZHS16GBK字符集,数据库按双字节进行处理,且当字节对应的十进制数从129到254时,Oracle会按双字节处理,从而查找下一个字节内容,两个字节组成一个整体进行处理;但对WE8ISO8859P1,数据库完全是按单字节进行处理,所以不会有什么字节检查。
三当数据库为ZHS16GBK的情况描述
1 数据库端配置
在Windows下我们使用默认的Oracle安装,当要DBCoffer正常工作时,需对listener.ora进行修改,其参考配置如下:
SID_LIST_LISTENER =
& (SID_LIST =
&&& (SID_DESC =
&&&&& (SID_NAME = ljb)
&&&&& (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
&&& (SID_DESC =
&&&&& (SID_NAME = PLSExtProc)
&&&&& (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
&&&&& (ENVS = EXTPROC_DLLS=ANY)
&&&&& (PROGRAM = extproc)
LISTENER =
& (DESCRIPTION_LIST =
&&& (DESCRIPTION =
&&&&& (ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
&&&&& (ADDRESS = (PROTOCOL = TCP)(HOST = Jiabo)(PORT = 1521))
关于此种情况下的Oracle客户端环境变量的设置,可以在注册表查找到:
NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
2 加密解密情况描述
正常安装DBCoffer完成后,便可以正常加密解密数据
3 导出导入情况描述
& &当加密一个表后,我们知道加密后的密文长度都是一个奇数值,当将密文表用exp命令导出数据库后,然后将原密文表重命名,而后将导出的数据导入数据库,此时会出现的情况是密文字段部分数据的最后一个字节内容丢失,当再次将此时导入的密文表再次导出去,并且与原导出的表的二进制文件进行比较时,明显数据对不上,且丢失的字节大小范围都在对应的十进制的129到254,那么这样一来,就可以确定是数据库字符集处理产生的问题,因为密文长度是一个奇数值,假如当密文的数据的最后一个字节内容为129到254时,会出现如前面所描述的情况发生,Oracle服务端会将最后一个字节作双字节处理,如果找不到下一
个字节,则将此字节丢失。
关于以上情况:我们可以用lengthb(密文字段)去查看,原密文表的密文长度都是一个固定的奇数值,而再次导入表密文表的密文字段有部分是比该奇数值小1的,所以针对密文表的查询会报-10004,加密数据不完整。
四当数据库为WE8ISO8859P1的情况描述
1 新建一个Oracle数据库实例iso8859
此步可以利用DBCA工具进行,当进行至第十步时,按下图所示设置数据库字符集。
2 修改Oracle的listener.ora和tnames.ora的配置
& 关于listener.ora的配置参考如下:
# listener.ora Network Configuration File: E:\oracle\product\10.2.0\db_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
& (SID_LIST =
&&& (SID_DESC =
&&&&& (SID_NAME = ljb)
&&&&& (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
&&& (SID_DESC =
&&&&& (SID_NAME = iso8859)
& &&&&(ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
&&& (SID_DESC =
&&&&& (SID_NAME = orcl)
&&&&& (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
&&& (SID_DESC =
&&&&& (SID_NAME = PLSExtProc)
&&&&& (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
&&&&& (ENVS = "EXTPROC_DLLS=ANY,ODC_SECURE_SERVICE_API_CONFIG_FILE=C:\DBCoffer\DBCSecureServiceAPI\secureServiceAPI.conf,NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1")
&&&&& (PROGRAM = extproc)
LISTENER =
& (DESCRIPTION_LIST =
&&& (DESCRIPTION =
&&&&& (ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
&&&&& (ADDRESS = (PROTOCOL = TCP)(HOST = Jiabo)(PORT = 1521))
其中请一定注意红色部分的内容,如果用Net Manager修改相关配置后,也请以此文件为参考,否则有可能我们的DBCoffer可能不能正常工作,而在tnames.ora的配置就相对较简单,添加如下内容即可:
& (DESCRIPTION =
&&& (ADDRESS_LIST =
&&&&& (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
&&& (CONNECT_DATA =
&&&&& (SERVICE_NAME = iso8859)
最后重启监听即可。
3 测试新实例
& &&利用sqplus工具进行登录,发现能正常进入,则表明新实例建立成功,接下来我们测试下中文支持情况,发现中文是能插入到表中,但查询出来的中文数据全是“?”,还有最后一个问题,就是修改客户端字符集,因为此时的客户端还是ZHS16GBK,此字符集与
WE8ISO8859P1是不兼容的,即之间没有大小包含关系,所以我们需要修改Oracle客户端NLS_LANG的环境变量,此处为了不要破坏原来实例的数据库环境,所以决定新添加一个Windows用户级的环境变量:NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1即可,此时再次对中文的支持情况进行测试,发现此时插入与查询都正常。
4 用DBCoffer加密处理
&&&&&按正常的情况加密、授权、查询、解密,可以看到都正常。
5 数据的导出导入测试
&&&& 对于当数据库字符集为 ZHS16GBK 时导出导入出现数据丢失的测试用例再次在数据库字符集为 WE8ISO8859P1进行测试,此时上面出现的数据丢问题不复存在,后来再次加大数据量,加密部分字段后,再次导出再导入,依然没有出现数据丢失的情况,解密正常。
五 DBCoffer关于两种字符集在Oracle端的通用配置总结
1 需要重启操作系统的配置参考
系统级环境变量里加一个NLS_LANG的环境变量
NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
& 监听器配置参考如下:
SID_LIST_LISTENER =
& (SID_LIST =
&&& (SID_DESC =
&&&&& (SID_NAME = ljb)
&&&&& (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
&&& (SID_DESC =
&&&&& (SID_NAME = PLSExtProc)
&&&&& (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
&&&&& (ENVS = EXTPROC_DLLS=ANY)
&&&&& (PROGRAM = extproc)
LISTENER =
& (DESCRIPTION_LIST =
&&& (DESCRIPTION =
&&&&& (ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
&&&&& (ADDRESS = (PROTOCOL = TCP)(HOST = Jiabo)(PORT = 1521))
注:请严格按照红色字体格试
修改完成后,请重启操作系统。
2 不需要重启操作系统的配置参考
用户级环境变量里加一个NLS_LANG的环境变量
NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
& 监听器配置参考如下:
# listener.ora Network Configuration File: E:\oracle\product\10.2.0\db_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
& (SID_LIST =
&&& (SID_DESC =
&&&&& (SID_NAME = ljb)
&&&&& (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
&&& (SID_DESC =
&&&&& (SID_NAME = iso8859)
&&&&& (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
&&& (SID_DESC =
&&&&& (SID_NAME = orcl)
&&&&& (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
&&& (SID_DESC =
&&&&& (SID_NAME = PLSExtProc)
&&&&& (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
&&&&& (ENVS = "EXTPROC_DLLS=ANY,ODC_SECURE_SERVICE_API_CONFIG_FILE=C:\DBCoffer\DBCSecureServiceAPI\secureServiceAPI.conf,NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1")
&&&&& (PROGRAM = extproc)
LISTENER =
& (DESCRIPTION_LIST =
&&& (DESCRIPTION =
&&&&& (ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
&&&&& (ADDRESS = (PROTOCOL = TCP)(HOST = Jiabo)(PORT = 1521))
请在此处指定字符集为你的Oracle服务端字符集,具体情况时,红色部分修改成对应的配置内容。
3 关于通用配置的原理说明
此处主要是关于NLS_LANG这个环境变量的说明,客户端依据其最先找到的NLS_LANG作为参考字符集,顺序为:用户级环境变量,系统级环境变量,注册表中Oracle中NLS_LANG;监听器也是依据其NLS_LANG作为其参考字符集,顺序为:在监听器内部指定的NLS_LANG,监听器进程所属用户级环境变量的NLS_LANG,注册表中Oracle中的NLS_LANG。
有此上面所说的原理后,相关先项的内容便可灵活设置,总之保证一点:Oracle客户端和监听器所需要的NLS_LANG与Oracle服务端保持一致。
相关资讯 & & &
& (08/11/:36)
& (04/08/:32)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款NightWolves 的BLOG
用户名:NightWolves
文章数:70
评论数:89
访问量:417173
注册日期:
阅读量:5863
阅读量:12276
阅读量:300125
阅读量:1019865
51CTO推荐博文
&&&& 昨天要把自己机器上的数据库迁移到专用服务器上一份,本地安装的Oracle10g,服务器上安装的数据库是Oracle9i,一开始进行如下操作:
本地导出数据库文件:
exp gzwp/wlkp@taxser file= d:\.dmp owner=gzwp拿到服务器上导入:
imp gzwp/wlkp@taxser file=d:\.dmp fromuser=gzwp touser=gzwp ignore=y
报错:IMP-00010:不是有效的导出文件,标题验证失败 IMP-00000:未成功导入
原因是数据库版本的问题,Oracle不支持高版本导入到低版本。解决方法:1.在服务器上配置一个Oracle的数据库连接到本地Oracle10g(叫做taxser134),方式是通过oracle提供的帮助工具Net Manager或者修改tnsname.tra(9i的目录:%oracle_home%\ora92\network\admin,10g对应的目录:%oracle_home%\product\10.2.0\db_1\NETWORK\ADMIN)在远程服务器上导出数据库文件:
exp gzwp/wlkp@taxser134 file= d:\.dmp owner=gzwp
2.在远程服务器上新建对应的数据库,用户以及表空间:
1&.可以通过oracle工具Database Configuration Assistant新建数据库实例(ntaxser):& 要注意选择字符集时和本地的数据库对应,否则可能出现中文乱码。
sqlplus sys/wlkp as sysdba
create user gzwp identified by
grant connect,resource,dba,create session to
create tablespace WLKPTABLE&&&& logging&&&& datafile 'F:\oracle\product\10.1.0\oradata\ntaxser\WLKPTABLE.dbf'&&&&size 50m&&&& autoextend on&&&& next 50m maxsize 20480m&&&& ext
//.......所有用到的表空间
3.然后导入到服务器上导入:
imp gzwp/wlkp@ntaxser file=d:\.dmp fromuser=gzwp touser=gzwp ignore=y
导入成功!
其实,所有关于oracle数据库高版本向低版本迁移的解决方法,做法都是类似的:通过在低版本Oracle上配置一个连接到高版本数据库,通过低版本oracle客户端导出数据文件,然后再进行导入。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
15:14:46 10:49:39 09:41:22工作需要,安装装了oracle 11g,在导入其他机器上的备份数据的时间,发生一个错误:
IMP-00019: 由于 ORACLE 错误 12899 而拒绝行IMP-00003: 遇到 ORACLE 错误 12899ORA-12899: 列 "ZHENG"."D_DIC"."DICEXPLAIN" 的值太大 (实际值: 140, 最大值: 100)
这个数据表结构是直接注入的,根本不会这样子的啊。后来在网上查了才知道原来是字符集的问题:
在日志文件里,开始导入时候有这样一个提示:"
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入导入服务器使用 AL32UTF8 字符集 (可能的字符集转换)
"原来在我的Windows server 2003系统上安装oracle,默认的字符集跟操作系统一致,是AL32UTF8。
AL32UTF8里,一个汉字是占用3个字符位,而一般我们用Windows XP中默认的是ZHS16GBK ,一个汉字用2个字符位。这样,直接导入数据就直接溢出了。
在网上找到一个修改字符集的方法:
&SQL& conn sys/SQL&SQL& STARTUP MOUNT;SQL& ALTER SESSION SET SQL_TRACE=TRUE;SQL& ALTER SYSTEM ENABLE RESTRICTED SESSION;SQL& ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;SQL& ALTER SYSTEM SET AQ_TM_PROCESSES=0;SQL& ASQL& ALTER DATABASE CHARACTER SET ZHS16GBK;
SQL& SSQL&oracle数据库的字符集更改 A、oracle server端字符集查询 select userenv(&language&) from dual 其中NLS_CHARACTERSET 为server端字符集 NLS_LANGUAGE 为 server端字符显示形式 B、查询oracle client端的字符集 $echo $NLS_LANG 如果发现你select 出来的数据是乱码,请把client端的字符集配置成与linux操作系统相同的字符集。如果还是有乱码,则有可能是数据库中的数据存在问题,或者是oracle服务端的配置存在问题。 C、server端字符集修改 ***************************************************************** * 更改字符集步骤方法(WE8ISO8859P1 --& ZHS16GBK)&&&&&&&&&&& * ***************************************************************** SQL& 将数据库启动到RESTRICTED模式下做字符集更改: SQL& conn /as sysdba Connected. SQL& Database closed. Database dismounted. ORACLE instance shut down. SQL& startup mount ORACLE instance started. Total System Global Area
bytes Fixed Size&&&&&&&&&&&&&&&&&& 451684 bytes Variable Size&&&&&&&&&&&&
bytes Database Buffers&&&&&&&&&&
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& Database altered. SQL& ALTER DATABASE CHARACTER SET ZHS16GBK; ALTER DATABASE CHARACTER SET ZHS16GBK * ERROR at line 1: ORA-12712: new character set must be a superset of old character set 提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改: SQL& ALTER DATABASE character set INTERNAL_USE ZHS16GBK; Database altered. SQL& select * from v$nls_ 略 19 rows selected. 重启检查是否更改完成: SQL& Database closed. Database dismounted. ORACLE instance shut down. SQL& startup ORACLE instance started. Total System Global Area
bytes Fixed Size&&&&&&&&&&&&&&&&&& 451684 bytes Variable Size&&&&&&&&&&&&
bytes Database Buffers&&&&&&&&&&
bytes Redo Buffers&&&&&&&&&&&&&&&& 667648 bytes Database mounted. Database opened. SQL& select * from v$nls_ 略 19 rows selected. 我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使 Oracle数据库绕过了子集与超集的校验. 这一方法在某些方面是有用处的,比如测试;应用于产品环境大家应该格外小心,除了你以外,没有人会为此带来的后果负责: 结语(我们不妨再说一次): 对于DBA来说,有一个很重要的原则就是:不要把你的数据库置于危险的境地! 这就要求我们,在进行任何可能对数据库结构发生改变的操作之前,先做有效的备份,很多DBA没有备份的操作中得到了惨痛的教训 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ D、client端字符集修改 在 /home/oracle与 /root用户目录下的.bash_profile中 添加或修改 export NLS_LANG="AMERICAN_AMERICA.UTF8" 语句 关闭当前ssh窗口。 注意 NLS_LANG变量一定要配置正确否则会引起sqlplus 失效 本篇文章来源于:开发学院 && 原文链接:&
阅读(...) 评论()君,已阅读到文档的结尾了呢~~
oracle常用傻瓜问题..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
oracle常用傻瓜问题
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口Oracle字符集的查看查询和Oracle字符集的设置修改
本文主要讨论以下几个部分:如何查看查询oracle字符集、 修改设置字符集以及常见的oracle utf8字符集和oracle exp 字符集问题。
一、什么是Oracle字符集
&&&&&& Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
影响数据库字符集最重要的参数是NLS_LANG参数。
它的格式如下: NLS_LANG = language_territory.charset
它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。
Language: 指定服务器消息的语言, 影响提示信息是中文还是英文
Territory: 指定服务器的日期和数字格式,
Charset:& 指定字符集。
如:AMERICAN _ AMERICA. ZHS16GBK
从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。
所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
怎么查看数据库版本
select * from v$version   包含版本信息,核心版本信息,位数信息(32位或64位)等  至于位数信息,在Linux/unix平台上,可以通过file查看,如file $ORACLE_HOME/bin/oracle
二、. 查看数据库字符集
数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。
  客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,
  表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
  会话字符集环境select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
  客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session&环境变量&注册表&参数文件
  字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
涉及三方面的字符集,
1. oracel server端的字符集;
2. oracle client端的字符集;
3. dmp文件的字符集。
在做数据导入的时候,需要这三个字符集都一致才能正确导入。
2.1 查询oracle server端的字符集
有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种:
SQL& select userenv('language')
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
SQL&select userenv(&language&)
AMERICAN _ AMERICA. ZHS16GBK
2.2 如何查询dmp文件的字符集
用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:
SQL& select nls_charset_name(to_number('0354','xxxx'))
如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):
cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6
然后用上述SQL也可以得到它对应的字符集。
2.3 查询oracle client端的字符集
在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,
比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK
这样就只影响这个窗口里面的环境变量。
在unix平台下,就是环境变量NLS_LANG。
$echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
如果检查的结果发现server端与client端字符集不一致,请统一修改为同server端相同的字符集。
(1).数据库服务器字符集
select * from nls_database_parameters
来源于props$,是表示数据库的字符集。
(2).客户端字符集环境
select * from nls_instance_parameters
其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
(3).会话字符集环境
select * from nls_session_parameters
来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
(4).客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。
如果多个设置存在的时候,NLS作用优先级别:Sql function & alter session & 环境变量或注册表& 参数文件& 数据库默认参数
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
三. 修改oracle的字符集
8i以上版本可以通过alter database来修改字符集,但也只限于子集到超集,不建议修改props$表,将可能导致严重错误。
  Alter data
  Alter system enabl
  Alter system set job_queue_process=0;
  Alter database character set zhs16
按照上文所说,数据库字符集在创建后原则上不能更改。因此,在设计和安装之初考虑使用哪一种字符集十分重要。对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。特别说明,我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。
不过修改字符集有2种方法可行。
1. 通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换。
2. 通过ALTER DATABASE CHARACTER SET语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。
3.1 修改server端字符集(不建议使用)
1.&&&&&& 关闭数据库
SQL&SHUTDOWN IMMEDIATE
2. 启动到Mount
SQL&STARTUP MOUNT;
SQL&ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL&ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL&ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL&ALTER DATABASE OPEN;
--这里可以从父集到子集
SQL&ALTER DATABASE CHARACTER SET ZHS16GBK;
SQL&ALTER DATABASE NATIONAL CHARACTER SET AL16UTF16;
--如果是从子集到父集,需要使用INTERNAL_USE 参数,跳过超子集检测
SQL&ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
SQL&ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16;
SQL&SHUTDOWN IMMEDIATE;
SQL&STARTUP
注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,不然不能start) 按上面的做法就可以。
若出现&ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists& 这样的提示信息,
要解决这个问题有两种方法
1. 利用INTERNAL_USE 关键字修改区域设置,
2. 利用re-create,但是re-create有点复杂,所以请用internal_use
SQL&SHUTDOWN IMMEDIATE;
SQL&STARTUP MOUNT EXCLUSIVE;
SQL&ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL&ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL&ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL&ALTER DATABASE OPEN;
SQL&ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;
SQL&SHUTDOWN
如果按上面的做法做,National charset的区域设置就没有问题
3.2 修改dmp文件字符集
上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以&骗&过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。
具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。
比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码: SQL& select to_char(nls_charset_id('ZHS16GBK'), 'xxxx')
然后将dmp文件的2、3字节修改为0354即可。
如果dmp文件很大,用ue无法打开,就需要用程序的方法了。
3.3客户端字符集设置方法
&&&& 1)UNIX环境
&&&&&&&& $NLS_LANG=&simplified chinese&_china.zhs16gbk
&&&&&& &&$export NLS_LANG
&&&&&&&& 编辑oracle用户的profile文件
&&& 2)Windows环境
&&&&&&&& 编辑注册表
&&&&&&&& Regedit.exe ---》HKEY_LOCAL_MACHINE ---》SOFTWARE ---》ORACLE-HOME
& 或者在窗口设置:
&&&&&&& set nls_lang=AMERICAN_AMERICA.ZHS16GBK
四.字符集的相关知识:
4.1 字符集
&&& 实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。
&&& Oracle的字符集命名遵循以下命名规则:
&&& &Language&&bit size&&encoding&
&&& 即: &语言&&比特位数&&编码&
&&& 比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集
4.2 字符编码方案
4.2.1 单字节编码
&&& (1)单字节7位字符集,可以定义128个字符,最常用的字符集为US7ASCII
&&& (2)单字节8位字符集,可以定义256个字符,适合于欧洲大部分国家
&&&&&&&&&&&& 例如:WE8ISO8859P1(西欧、8位、ISO标准8859P1编码)
4.2.2 多字节编码
&&& (1)变长多字节编码
&&& 某些字符用一个字节表示,其它字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持,&& 例如日语、汉语、印地语等
&&& 例如:AL32UTF8(其中AL代表ALL,指适用于所有语言)、zhs16cgb231280
&&& (2)定长多字节编码
&&& 每一个字符都使用固定长度字节的编码方案,目前oracle唯一支持的定长多字节编码是AF16UTF16,也是仅用于国家字符集
4.2.3 unicode编码
&&& Unicode是一个涵盖了目前全世界使用的所有已知字符的单一编码方案,也就是说Unicode为每一个字符提供唯一的编码。UTF-16是unicode的16位编码方式,是一种定长多字节编码,用2个字节表示一个unicode字符,AF16UTF16是UTF-16编码字符集。
&&& UTF-8是unicode的8位编码方式,是一种变长多字节编码,这种编码可以用1、2、3个字节表示一个unicode字符,AL32UTF8,UTF8、UTFE是UTF-8编码字符集
4.3 字符集超级
&&& 当一种字符集(字符集A)的编码数值包含所有另一种字符集(字符集B)的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集A是字符集B的超级,或称字符集B是字符集A的子集。
&&& Oracle8i和oracle9i官方文档资料中备有子集-超级对照表(subset-superset pairs),例如:WE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式,因此有许多字符集是US7ASCII的超集,例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。
4.4 数据库字符集(oracle服务器端字符集)
&&& 数据库字符集在创建数据库时指定,在创建后通常不能更改。在创建数据库时,可以指定字符集(CHARACTER SET)和国家字符集(NATIONAL CHARACTER SET)。
4.4.1字符集
&&& (1)用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据
&&& (2)用来标示诸如表名、列名以及PL/SQL变量等
&&& (3)用来存储SQL和PL/SQL程序单元等
4.4.2国家字符集:
&&& (1)用以存储NCHAR, NVARCHAR2, NCLOB等类型数据
&&& (2)国家字符集实质上是为oracle选择的附加字符集,主要作用是为了增强oracle的字符处理能力,因为NCHAR数据类型可以提供对亚洲使用定长多字节编码的支持,而数据库字符集则不能。国家字符集在oracle9i中进行了重新定义,只能在unicode编码中的AF16UTF16和UTF8中选择,默认值是AF16UTF16
4.4.3查询字符集参数
&&& 可以查询以下数据字典或视图查看字符集设置情况
&&& nls_database_parameters、props$、v$nls_parameters
&&& 查询结果中NLS_CHARACTERSET表示字符集,NLS_NCHAR_CHARACTERSET表示国家字符集
4.4.4修改数据库字符集
&&& 按照上文所说,数据库字符集在创建后原则上不能更改。不过有2种方法可行。
1. 如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换。
2. 通过ALTER DATABASE CHARACTER SET语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。
4.5 客户端字符集(NLS_LANG参数)
4.5.1客户端字符集含义
&&& 客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用,例如sqlplus,exp/imp等。客户端字符集是通过设置NLS_LANG参数来设定的。
4.5.2 NLS_LANG参数格式
& &&NLS_LANG=&language&_&territory&.&client character set&
&&& Language: 显示oracle消息,校验,日期命名
&&& Territory:指定默认日期、数字、货币等格式
&&& Client character set:指定客户端将使用的字符集
&&& 例如:NLS_LANG=AMERICAN_AMERICA.US7ASCII
&&& AMERICAN是语言,AMERICA是地区,US7ASCII是客户端字符集
4.5.3客户端字符集设置方法
&&&& 1)UNIX环境
&&&&&&&& $NLS_LANG=&simplified chinese&_china.zhs16gbk
&&&&&&&& $export NLS_LANG
&&&&&&&& 编辑oracle用户的profile文件
&&& 2)Windows环境
&&&&&&&& 编辑注册表
&&&&&&&& Regedit.exe ---》HKEY_LOCAL_MACHINE ---》SOFTWARE ---》ORACLE-HOME
4.5.4 NLS参数查询
&&& Oracle提供若干NLS参数定制数据库和用户机以适应本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通过查询以下数据字典或v$视图查看。
NLS_DATABASE_PARAMETERS:显示数据库当前NLS参数取值,包括数据库字符集取值
NLS_SESSION_PARAMETERS:& 显示由NLS_LANG 设置的参数,或经过alter session 改变后的参数值(不包括由NLS_LANG 设置的客户端字符集)
NLS_INSTANCE_PARAMETE: 显示由参数文件init&SID&.ora 定义的参数
V$NLS_PARAMETERS:显示数据库当前NLS参数取值
4.5.5修改NLS参数
&&& 使用下列方法可以修改NLS参数
&&& (1)修改实例启动时使用的初始化参数文件
&&& (2)修改环境变量NLS_LANG
&&& (3)使用ALTER SESSION语句,在oracle会话中修改
&&& (4)使用某些SQL函数
&&& NLS作用优先级别:Sql function & alter session & 环境变量或注册表& 参数文件& 数据库默认参数
五.EXP/IMP 与 字符集
5.1 EXP/IMP
&&& Export 和Import 是一对读写Oracle数据的工具。Export 将Oracle 数据库中的数据输出到操作文件中, Import 把这些文件中的数据读到Oracle 数据库中,由于使用exp/imp进行数据迁移时,数据从源数据库到目标数据库的过程中有四个环节涉及到字符集,如果这四个环节的字符集不一致,将会发生字符集转换。
&&&& ____________ _________________ _____________
&&&& |imp导入文件|&-|环境变量NLS_LANG|&-|数据库字符集|
&&&&& ------------&& -----------------&& -------------
&&&& ____________ _________________ _____________
&&&& |imp导入文件|-&|环境变量NLS_LANG|-&|数据库字符集|
&&&&& ------------&& -----------------&& -------------
四个字符集是
&& (1)源数据库字符集
&& (2)Export过程中用户会话字符集(通过NLS_LANG设定)
&& (3)Import过程中用户会话字符集(通过NLS_LANG设定)
&& (4)目标数据库字符集
5.2导出的转换过程
&&& 在Export过程中,如果源数据库字符集与Export用户会话字符集不一致,会发生字符集转换,并在导出文件的头部几个字节中存储Export用户会话字符集的ID号。在这个转换过程中可能发生数据的丢失。
例:如果源数据库使用ZHS16GBK,而Export用户会话字符集使用US7ASCII,由于ZHS16GBK是16位字符集,而US7ASCII是7位字符集,这个转换过程中,中文字符在US7ASCII中不能够找到对等的字符,所以所有中文字符都会丢失而变成&?? &形式,这样转换后生成的Dmp文件已经发生了数据丢失。
因此如果想正确导出源数据库数据,则Export过程中用户会话字符集应等于源数据库字符集或是源数据库字符集的超集
5.3导入的转换过程
&&& (1)确定导出数据库字符集环境
&&&&&&&&&&&& 通过读取导出文件头,可以获得导出文件的字符集设置
&&& (2)确定导入session的字符集,即导入Session使用的NLS_LANG环境变量
&&& (3)IMP读取导出文件
&&&&&&&&&&&& 读取导出文件字符集ID,和导入进程的NLS_LANG进行比较
&&& (4)如果导出文件字符集和导入Session字符集相同,那么在这一步骤内就不需要转换,&&&&&&&&&&&& 如果不同,就需要把数据转换为导入Session使用的字符集。可以看出,导入数据到数据库过程中发生两次字符集转换
&&& 第一次:导入文件字符集与导入Session使用的字符集之间的转换,如果这个转换过程不能正确完成,Import向目标数据库的导入过程也就不能完成。
&&& 第二次:导入Session字符集与数据库字符集之间的转换。
摘自 newhappy的专栏
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 oracle 9i升级11g 的文章

 

随机推荐