|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于现有业务,可以轻松移植到MySQL。当你需要替换掉老的硬件,当你需要削减历史遗留下的老系统的时候,选用MySQL对于财务部门来说更具吸引力。甚么是Oracle字符集
Oracle字符集是一个字节数据注释的标记汇合,有巨细之分,有互相的包涵干系。
Oracle撑持国度言语的系统布局同意你利用当地化言语来存储,处置,检索数据。它使数据库工具,毛病动静,排次序序,日期,工夫,泉币,数字和日历主动顺应当地化言语战争台。
影响oracle数据库字符集最主要的参数是NLS_LANG参数。它的格局以下:
NLS_LANG=language_territory.charset
它有三个构成部分(言语、地区和字符集),每一个成份把持了NLS子集的特征。个中:
Language指定服务器动静的言语,territory指定服务器的日期和数字格局,charset指定字符集。如:AMERICAN_AMERICA.ZHS16GBK。
从NLS_LANG的构成我们能够看出,真正影响数据库字符集的实际上是第三部分。以是两个数据库之间的字符集只需第三部分一样就能够互相导进导出数据,后面影响的只是提醒信息是中文仍是英文。
怎样查询Oracle的字符集
良多人都碰着过由于字符集分歧而使数据导进失利的情形。这触及三方面的字符集,一是Oracelserver真个字符集,二是oracleclient真个字符集;三是dmp文件的字符集。在做数据导进的时分,必要这三个字符集都分歧才干准确导进。
1、查询OracleServer真个字符集
有良多种办法能够查出oracleserver真个字符集,对照直不雅的查询办法是以下这类:
SQL>selectuserenv(‘language’)fromdual;
了局相似以下:AMERICAN_AMERICA.ZHS16GBK.
2、怎样查询dmp文件的字符集
用Oracle的exp工具导出的dmp文件也包括了字符集信息,dmp文件的第2和第3个字节纪录了dmp文件的字符集。假如dmp文件不年夜,好比只要几M或几十M,能够用UltraEdit翻开(16进制体例),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:
SQL>selectnls_charset_name(to_number(0354,xxxx))fromdual;ZHS16GBK
假如dmp文件很年夜,好比有2G以上(这也是最多见的情形),用文本编纂器翻开很慢大概完整打不开,能够用以下命令(在unix主机上):
catexp.dmpod-xhead-1awk{print$2$3}cut-c3-6
然后用上述SQL也能够失掉它对应的字符集。
3、查询Oracleclient真个字符集
这个对照复杂。在Windows平台下,就是注册内外面响应OracleHome的NLS_LANG.还能够在Dos窗口内里本人设置,好比:
setnls_lang=AMERICAN_AMERICA.ZHS16GBK
如许就只影响这个窗口内里的情况变量。在Unix平台下,就是情况变量NLS_LANG.
$echo$NLS_LANGAMERICAN_AMERICA.ZHS16GBK
假如反省的了局发明Server端与Client端字符集纷歧致,请一致修正为同Server端不异的字符集。
修正Oracle的字符集
上文说过,oracle的字符集有相互的包涵干系。
如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会无数据注释上的成绩,不会无数据丧失。在一切的字符会合utf8应当是最年夜,由于它基于unicode,双字节保留字符(也因而在存储空间上占用更多)。
一旦数据库创立后,数据库的字符集实际上讲是不克不及改动的。因而,在计划和安装之初思索利用哪种字符集非常主要。依据Oracle的官方申明,字符集的转换是从子集到超集受撑持,反之不可。假如两种字符集之间基本没有子集和超集的干系,那末字符集的转换是不受oracle撑持的。对数据库server而言,毛病的修正字符集将会招致良多不成测的成果,大概会严峻影响数据库的一般运转,以是在修正之前必定要确认两种字符集是不是存在子集和超集的干系。一样平常来讲,除非万不得已,我们不倡议修正oracle数据库server真个字符集。出格申明,我们最经常使用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集干系,因而实际上讲这两种字符集之间的互相转换不受撑持。
修正Server端字符集(不倡议利用):
在Oracle8之前,能够用间接修正数据字典表props$来改动数据库的字符集。但Oracle8以后,最少有三张体系表纪录了数据库字符集的信息,只改props$表其实不完整,大概引发严峻的成果。准确的修正办法以下:
$sqlplus/nologSQL>conn/assysdba;
若此时数据库服务器已启动,则先实行SHUTDOWNIMMEDIATE命令封闭数据库服务器,然后实行以下命令:
SQL>STARTUPMOUNT;
SQL>ALTERSYSTEMENABLERESTRICTEDSESSION;
SQL>ALTERSYSTEMSETJOB_QUEUE_PROCESSES=0;
SQL>ALTERSYSTEMSETAQ_TM_PROCESSES=0;
SQL>ALTERDATABASEOPEN;
SQL>ALTERDATABASECHARACTERSETZHS16GBK;
SQL>ALTERDATABASEnationalCHARACTERSETZHS16GBK;
SQL>SHUTDOWNIMMEDIATE;SQL>STARTUP
修正dmp文件字符集:
上文说过,dmp文件的第2第3字节纪录了字符集信息,因而间接修正dmp文件的第2第3字节的内容就能够‘骗’过oracle的反省。如许做实际上也仅是从子集到超集能够修正,但良多情形下在没有子集和超集干系的情形下也能够修正,我们经常使用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基础都能够改。由于改的只是dmp文件,以是影响不年夜。
详细的修正办法对照多,最复杂的就是间接用UltraEdit修正dmp文件的第2和第3个字节。好比想将dmp文件的字符集改成ZHS16GBK,能够用以下SQL查出该种字符集对应的16进制代码:
SQL>selectto_char(nls_charset_id(ZHS16GBK),xxxx)fromdual;0354
然后将dmp文件的2、3字节修正为0354便可。
假如dmp文件很年夜,用ue没法翻开,就必要用程序的办法了。网上有人用java存储历程写了转换的程序(用java存储历程的优点是通用性教好,弱点是对照贫苦)。我在Windows下测试经由过程。但请求Oracle数据库必定要安装JVM选项。每个人都在使用它。MySQL是开源LAMP组合的一个标准组件:Linux、Apache、MySQL和Perl/PHP。根据Evans的调查,LAMP组合的迅速推广很大程度上代表着MySQL的被广泛接受。 |
|