最好的改正ORACLE字符集文档[网站编程]
本文“最好的改正ORACLE字符集文档[网站编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
测试的时刻,本机oracle安装采取了utf8字符集,而项目的要求是gbk字符集,为了避免今后有差别字符集数据信息导入导出的问题,整理以下文档.
改正oracle字符集新装了oracle,装为AL32UTF8格局,无奈一个工程导出包是ZHS16GBK格局,想了想办法转换,以下是学习
1、什么是oracle字符集
Oracle字符集是一个字节数据的注释的标记调集,有大小之分,有彼此的包涵关系.ORACLE 支持国家语言的体系构造答应你利用本地化语言来存储,处理,检索数据.它使数据库工具,错误消息,排序次序,日期,时间,钱币,数字,和日历自动适应本地化语言和平台.
影响oracle数据库字符集最重要的参数是NLS_LANG参数.它的格局以下:
NLS_LANG = language_territory.charset
它有三个构成部份(语言、地域和字符集),每个成份掌握了NLS子集的特点.此中:
Language 指定服务器消息的语言,territory 指定服务器的日期和数字格局,charset 指定字符集.如:AMERICAN _ AMERICA. ZHS16GBK
从NLS_LANG的构成我们可以看出,真正影响数据库字符集的其实是第三部份.所以两个数据库之间的字符集只要第三部份一样便可以彼此导入导出数据,前面影响的只是提醒信息是中文还是英文.
3、改正oracle的字符集
上文说过,oracle的字符集有彼此的包涵关系.如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据注释上的问题,不会有数据丧失.在全部的字符集合utf8应当是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多).
一旦数据库成立后,数据库的字符集理论上讲是不能改变的.因此,在计划和安装之初考虑利用哪一种字符集非常重要.按照Oracle的官方阐明,字符集的转换是从子集到超集受支持,反之不行.假如两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的.对数据库server而言,错误的改正字符集将会招致很多不可测的后果,大概会严重影响数据库的正常运行,所以在改正之前一定要确认两种字符集能否存在子集和超集的关系.普通来说,除非万不得已,我们不倡议改正oracle数据库server端的字符集.分外阐明,我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的彼此转换不受支持.
1、改正server端字符集(不倡议利用)
在oracle 8之前,可以用直接改正数据字典表props$来改变数据库的字符集.但oracle8之后,至少有三张系统表记录了数据库字符集的信息,只改props$表并不完好,大概惹起严重的后果.精确的改正办法以下:
$sqlplus /nolog
SQL>conn / as sysdba;
以上办法测试不行,用scott/tiger登陆sqlplus然后connect sys/sys as sysdba,然后输入号令便可
若此时数据库服务器已启动,则先履行SHUTDOWN IMMEDIATE号令关闭数据库服务器,然后履行以下号令:
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 INTERNAL_USE ZHS16GBK; //跳过超子集检测
SQL>ALTER DATABASE national CHARACTER SET INTERNAL ZHS16GBK;
这一行不起作用,履行后出错ORA-00933: SQL 号令未精确完毕,不过履行上一行号令已经见效,其他文章里未提到本行.
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
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') from dual;
0354
然后将dmp文件的2、3字节改正成0354便可.
假如dmp文件很大,用ue无法翻开,就需求用程序的办法了.网上有人用java存储历程写了转换的程序(用java存储历程的好处是通用性教好,缺陷是对比麻烦).我在windows下测试通过.但要求oracle数据库一定要安装JVM选项.有爱好的朋友可以研究一下程序代码
2、若何查询Oracle的字符集
很多人都碰到过因为字符集差别而使数据导入失利的情形.这触及三方面的字符集,一是oracel server端的字符集,二是oracle client端的字符集;三是dmp文件的字符集.在做数据导入的时刻,需求这三个字符集都一致才能精确导入.
1、查询oracle server端的字符集
有很多种办法可以查出oracle server端的字符集,对比直观的查询办法是以下这种:SQL>select userenv(‘language’) from dual;
后果近似以下:AMERICAN _ AMERICA. ZHS16GBK (本机后果SIMPLIFIED CHINESE_CHINA.AL32UTF8)
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')) from dual;
ZHS16GBK
假如dmp文件很大,比方有2G以上(这也是最常见的情形),用文本编辑器翻开很慢大概完好打不开,可以用以下号令(在unix主机上):
cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6
然后用上述SQL也可以得到它对应的字符集.
3、查询oracle client端的字符集
这个对比简单.在windows平台下,就是注册表里面HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG .还可以在dos窗口里面自己设置,比方:
set nls_lang=AMERICAN_AMERICA.ZHS16GBK
这样就只影响这个窗口里面的环境变量.
在unix平台下,就是环境变量NLS_LANG.
$echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
假如查抄的后果发现server端与client端字符集不一致,请统一改正成同server端相同的字符集.
以上是“最好的改正ORACLE字符集文档[网站编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |