oracle客户端与java服务器端和客户端字符集不一样怎么办

oracle查看字符集后修改oracle服务端和客户端字符集的步骤
字体:[ ] 类型:转载 时间:
本文介绍了oracle server端查询字符集后,修改oracle服务端和客户端字符集的步骤,大家参考使用吧
1.oracle server端字符集查询 代码如下:select userenv('language')
server字符集修改:
将数据库启动到RESTRICTED模式下做字符集更改: 代码如下:SQL&conn /as sysdba
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 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;&&
SQL&select * from v$nls_&
重启检查是否更改完成: 代码如下:SQL&
SQL&startup
SQL&select * from v$nls_
我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使Oracle数据库绕过了子集与超集的校验
这一方法在某些方面是有用处的,比如测试;应用于产品环境时大家应该小心,可能会有一些意外的问题。
2.oracle client端字符集修改
代码如下:$echo$NLS_LANG
client字符集修改:&&
&在 /home/oracle与 /root用户目录下的.bash_profile中添加或修改 export NLS_LANG="AMERICAN_AMERICA.UTF8" 语句
&关闭当前ssh窗口。
注意:NLS_LANG变量一定要配置正确否则会引起sqlplus失效。
3.修改数据库字符集为UTF-8
1.以DBA登录
2.执行转换语句:
代码如下:SHUTDOWN IMMEDIATE;
STARTUP MOUNT EXCLUSIVE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE NATIONAL CHARACTER SET UTF8;
SHUTDOWN IMMEDIATE;
注意:如果没有大对象,在使用过程中进行语言转换没有什么影响!
可能会出现ORA-12717:CANNOT ALTER DATABASE NATIONAL CHARACTER SET WHEN NCLOBDATAEXISTS, 解决这个问题的方法
利用INTERNAL_USE 关键字修改区域设置 代码如下:ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具查看: 1130|回复: 7
请问oracle客户端的字符集应该跟谁保持一致?(客户端还是服务器端)
论坛徽章:2
请问 oracle客户端的字符集NLS_LANG应该设置成跟oracle客户端一致还是跟oracle数据库字符集一致?
认证徽章论坛徽章:24
数据库要和操作系统字符集保持一致!
认证徽章论坛徽章:24
奈门摩尔 发表于
数据库要和操作系统字符集保持一致!
说反了...囧
论坛徽章:0
本帖最后由 hong2611 于
17:28 编辑
个人认为:oracle 客户端的NLS_LANG设置成oracle数据库的字符集的子集一般不会有错的。
论坛徽章:2
谢谢,那就是说NLS_LANG应该跟客户端的字符集保持一致,NLS_LANG如果设置跟数据库服务器字符集保持一致,会有什么后果呢?
论坛徽章:9
zxc116 发表于
谢谢,那就是说NLS_LANG应该跟客户端的字符集保持一致,NLS_LANG如果设置跟数据库服务器字符集保持一致,会 ...
显示出现乱码
认证徽章论坛徽章:488
客户端NLS_LANG与本地化环境采用了不同的字符集会出现乱码,除非本地化环境的字符集是客户端NLS_LANG设置字符集的子集
论坛徽章:295
和客户端的操作系统的字符集保持一致,
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号查看oracle服务端和客户端的字符集查看oracle数据库字符集select * from nls_database_查看客户端字符集:select userenv('language')客户端字符集环境:select * from nls_instance_会话字符集环境:select * from nls_session_和oracle字符集相关的参数是&nls_lang。NLS_LANG&的格式是:&&&&language_territory.client_charset如AMERICAN_AMERICA.ZHS16GBK,那么第一位AMERICAN&表示语言,第二位&AMERICA&表示日期和数字格式,第三位&ZHS16GBK&表示字符集。影响数据库和客户端的其实是第三部分。修改服务端字符集(谨慎,不推荐)数据库创建以后,如果需要修改字符集,通常需要重建数据库,通过导入导出的方式来转换。也可以通过以下方式更改:ALTER&DATABASE&CHARACTER&SET注意修改数据库字符集时必须谨慎,修改之前一定要为数据库备份。由于不能回退这项操作,因此可能会造成数据丢失或者损坏。&这是最简单的转换字符集的方式,但并不是总是有效。这个命令在Oracle&8时被引入Oracle,这个操作在本质上并不转换任何数据库字符,只是简单地更新数据库中所有跟字符集相关的信息。&这意味着只能在新字符集是旧字符集严格超集的情况下使用这种方式转换。所谓超集是指当前字符集中的每一个字符集在新字符集中都可以表示,并使用相同的代码点,比如很多字符集都是US7ASCII的严格超集。如果不是超集将获得以下错误:SQL&&ALTER&DATABASE&CHARACTER&SET&ZHS16CGB231280;*ERROR&at&line&1:ORA-12712:&new&character_set_must&bu&a&superset&of&old&character&set下面在11g环境下进行测试sys@ORCL&select userenv('language')sys@ORCL&select * from nls_database_sys@ORCL&select name,value$ from props$ where name like '%NLS%';&NAME&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&VALUE$-------------------------&& -----------------------------------------------------------------------------NLS_LANGUAGE&&&&&&&&&&&&&&&&&&&&&&&&&&&& AMERICANNLS_TERRITORY&&&&&&&&&&&&&&&&&&&&&&&&&&& AMERICANLS_CURRENCY&&&&&&&&&&&&&&&&&&&&&&&&&&&& $NLS_ISO_CURRENCY&&&&&&&&&&&&&&&&&&&&&&&& AMERICANLS_NUMERIC_CHARACTERS&&&&&&&&&&&&&&&&&& .,NLS_CHARACTERSET&&&&&&&&&&&&&&&&&&&&&&&& ZHS16GBKNLS_CALENDAR&&&&&&&&&&&&&&&&&&&&&&&&&&&& GREGORIANNLS_DATE_FORMAT&&&&&&&&&&&&&&&&&&&&&&&&& DD-MON-RRNLS_DATE_LANGUAGE&&&&&&&&&&&&&&&&&&&&&&& AMERICANNLS_SORT&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& BINARYNLS_TIME_FORMAT&&&&&&&&&&&&&&&&&&&&&&&&& HH.MI.SSXFF AMNLS_TIMESTAMP_FORMAT&&&&&&&&&&&&&&&&&&&& DD-MON-RR HH.MI.SSXFF AMNLS_TIME_TZ_FORMAT&&&&&&&&&&&&&&&&& &&&&&HH.MI.SSXFF AM TZRNLS_TIMESTAMP_TZ_FORMAT&&&&&&&&&&&&&&&&& DD-MON-RR HH.MI.SSXFF AM TZRNLS_DUAL_CURRENCY&&&&&&&&&&&&&&&&&&&&&&& $NLS_COMP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& BINARYNLS_LENGTH_SEMANTICS&&&&&&&&&&&&&&&&&&&& BYTENLS_NCHAR_CONV_EXCP&&&&& &&&&&&&&&&&&&&&&FALSENLS_NCHAR_CHARACTERSET&&&&&&&&&&&&&&&&&& AL16UTF16NLS_RDBMS_VERSION&&&&&&&&&&&&&&&&&&&&&&& 11.2.0.4.020 rows selected.&sys@ORCL&create table scott.test(id number(18,0),name varchar2(20));sys@ORCL&insert into scott.test values(1,'zhong');sys@ORCL&insert into scott.test values(2,'钟');sys@ORCL&SQL& select * from scott.&&&&&&&&&&&&&&&& ID NAME------------------- --------------------&&&&&&&&&&&&&&&&& 2&钟&&&&&&&&&&&&&&&&& 1 zhong&SQL& select name, dump(name) from scott.NAME&&&&&&&&&&&&&&&& DUMP(NAME)-------------------- --------------------------------------------------------------------------------钟&&&&&&&&&&&&&&&&&& Typ=1 Len=2: 214,211zhong&&&&&&&&&&&&&&& Typ=1 Len=5: 122,104,111,110,103转换字符集,数据库应该在RESTRICTED(限制会话)模式下进行:sys@ORCL&shut immediatesys@ORCL&startup mountsys@ORCL&alter session set sql_trace=sys@ORCL&alter system enablsys@ORCL&alter system set job_queue_processes=0;sys@ORCL&alter system set aq_tm_processes=0;sys@ORCL&sys@ORCL&alter database character set AL32UTF8;alter database character set AL32UTF8*ERROR at line 1:ORA-12712: new character set must be a superset of old character set出现错误提示,新字符集必须是老字符集的超集,也就原来字符集是新字符集的子集,可以再Oracle官方文档上查询字符集包含关系。下面使用Oracle内部命令internal_use,跳过超集检查,生产环境不建议使用此方法。sys@ORCL&alter database character set internal_use AL32UTF8;&sys@ORCL&shut immediatesys@ORCL&startup&sys@ORCL&select name,value$ from props$ where name like '%NLS%';&NAME&&&&&&&&&&&&&&&&&& &&&&&&&&VALUE$--------------------------&&&&&& --------------------------NLS_LANGUAGE&&&&&&&&&&&&&&&&&& AMERICANNLS_TERRITORY&&&&&&&&&&&&&&&&& AMERICANLS_CURRENCY&&&&&&&&&&&&&&&&&& $NLS_ISO_CURRENCY&&&&&&&&&&&&&& AMERICANLS_NUMERIC_CHARACTERS&&&&&&& &.,NLS_CHARACTERSET&&&&&&&&&&&&&& AL32UTF8NLS_CALENDAR&&&&&&&&&&&&&&&&&& GREGORIANNLS_DATE_FORMAT&&&&&&&&&&&&&&& DD-MON-RRNLS_DATE_LANGUAGE&&&&&&&&&&&&& AMERICANNLS_SORT&&&&&&&&&&&&&&&&&&&&&& BINARYNLS_TIME_FORMAT&&&&&&&&&&&&&&& HH.MI.SSXFF AMNLS_TIMESTAMP_FORMAT&&&&&&&&&& DD-MON-RR HH.MI.SSXFF AMNLS_TIME_TZ_FORMAT&&&&&&&&&&&& HH.MI.SSXFF AM TZRNLS_TIMESTAMP_TZ_FORMAT&&&&&&& DD-MON-RR HH.MI.SSXFF AM TZRNLS_DUAL_CURRENCY&&&&&&&&&&&&& $NLS_COMP&&&&&&&&&&&&&&&&&&&&&& BINARYNLS_LENGTH_SEMANTICS&&&& &&&&&&BYTENLS_NCHAR_CONV_EXCP&&&&&&&&&&& FALSENLS_NCHAR_CHARACTERSET&&&&&&&& AL16UTF16NLS_RDBMS_VERSION&&&&&&&&&&&&& 11.2.0.4.020 rows selected.&sys@ORCL&alter system set job_queue_processes=10;sys@ORCL&alter system set aq_tm_processes=1;&SQL& select name, dump(name) from scott.NAME&&&&&&&&&&&&&&&& DUMP(NAME)-------------------- --------------------------------------------------------------------------------钟&&&&&&&&&&&&&&&&&& Typ=1 Len=2: 214,211zhong&&&&&&&&&&&&&&& Typ=1 Len=5: 122,104,111,110,103&SQL& insert into scott.test values(3,'钟');1 row inserted&SQL& select name, dump(name) from scott.NAME&&&&&&&&&&&&&&&& DUMP(NAME)-------------------- --------------------------------------------------------------------------------钟&&&&&&&&&&&&&&&&&& Typ=1 Len=2: 214,211zhong&&&&&&&&&&&&&&& Typ=1 Len=5: 122,104,111,110,103钟&&&&&&&&&&&&&&&&&& Typ=1 Len=3: 233,146,159在这里纠正一个由来已久的错误方法,经常可以在网上看到这样的更改字符集的方法,这种方法应该被忘记,绝对不应该被采用:(1)&用SYS用户登录ORACLE。(2)&查看字符集内容&&SELECT&*&FROM&props$;(3)&修改字符集&update&props$&set&value$='ZHS16GBK'&where&name='NLS_CHARACTERSET';&&update&props$&set&value$='AL32UTF8'&where&name='NLS_CHARACTERSET';我们可以轻易地指出,以上方法是不正确的,通过前面“ALTER&DATABASE&CHARACTER&SET”方式更改字符集时,Oracle&至少需要更改12张数据字典表,而这种直接更新props$表的方式只完成了其中十二分之一的工作,潜在的完整性隐患是可想而知的。所以,更改字符集尽量要使用正常的途径。修改客户端字符集linux下:查看当前客户端字符集[oracle@xuan1 ~]$ echo $NLS_LANG&&&american_america.ZHS16GBK&[oracle@xuan1 ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on Wed Jul 20 03:33:03 2016Copyright (c) , Oracle.& All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL&修改客户端字符集[oracle@xuan1 ~]$ export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"&[oracle@xuan1 ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on&星期三&7月&20 03:30:54 2016Copyright (c) , Oracle.& All rights reserved.连接到:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL&windows下:修改客户端字符集需要在注册表中修改NLS_LANGregedit& ---&&HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\xx指存在多个ORACLE_HOME时系统编号。乱码困扰有时候在linux中sqlplus插入中文字符后,使用plsql客户端连接查看确实乱码,在linux中确能看到中文,这是为什么呢?&&&其实与linux系统字符集设置有关,也就是LANG的设置。示列:[oracle@xuan1 ~]$ export.UTF-8[oracle@xuan1 ~]$ export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"此时如果是ssh到linux的,那么连接工具字符集应该设置为UTF-8SQL& create table shall(zhong varchar2(100));&SQL& insert into shall values('test!!&&测试!!');SQL& select *ZHONGtest!!&&测试!!在客户端上看就变成乱码了.....怎么办?看我的![oracle@xuan1 ~]$ export.GB2312&&&&&&&&&&&&&&&&&&&&&&&&&&[oracle@xuan1 ~]$ export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"此时如果是ssh到linux的,那么连接工具字符集应该设置为GB2312SQL& insert into shall values('zhong guo!!&中国!!');已创建&1&行。有点不一样咯,这里操作后有中文提示SQL& select *ZHONGtest!! &zhong guo!!&中国!!此时在客户端plsql上查看,也能查看到刚刚插入的那条数据咯总结一下:在plsql端创建表格,然后插入中文字符后,在服务端linux中sqlplus查看出现乱码?(1)如果只想查看数据,不修改,那么只需要把ssh连接的工具编码改为GB2312就能查看表中中文数据咯,但是不能插入或修改中文;(2) 如果想修改表中的中文数据,那么需要把linux系统中的LANG改为zh_CN.GB2312,然后才能插入中文数据,并且在plsql端能正常查看;(3) 改了LANG和ssh连接linux工具的字符编码为GB2312后,连接数据库还是英文提示,如果改为中文提示呢?这个需要设置数据库客户端字符集,如:select userenv('language')&&& ----查看当前客户端字符集[oracle@xuan1 ~]$ export NLS_LANG=american_america.ZHS16GBK&&& ----这个是改为英文操作提示[oracle@xuan1 ~]$ export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"&&& ----这个就是改为中文操作提示的当然,这只是我遇到的乱码问题,也许你的数据库字符集本身为UTF-8,那就不用想我这样设置咯。作者:彩伦原文链接:http://blog.itpub.net//viewspace-2122834/这个秋天,和百位大咖约个会!SACC2016作为国内最受欢迎的架构师盛会,2016第八届中国系统架构师大会(SACC)将于日-29日在北京万达索菲特大酒店撼世来袭!大会以"架构创新之路"为主题,共设置两个主场分享时段,24个技术交流专场时段;邀请来自互联网、电子商务、金融、电信、政府、行业协会等20多个领域,150多位技术专家及行业领袖来分享他们的经验;并将吸引4000多名系统运维、架构师、及各种企业的IT决策人士参会,为他们提供最具价值的交流平台。<seITPUB技术社区(itpuber) 
 文章为作者独立观点,不代表微头条立场
的最新文章
“ 摘要: 由于在数据库连接部分,新建连接的时候一直报“出错原因:超时时间已到。超时时间已到,但是尚未从池中通常,当我们将SQL语句提交给Oracle数据库时,Oracle会选择一种最优方式来执行,这是通过查询优化器Query Optimizer来实现的。乱码当打开一个文本文件,而它却给你展示外星文字或者火星语法,我们称此种乱象为乱码。通常情况下数字不乱码,英文今天和大家分享Oracle 12c的一个新特性——自动检测有用列组信息。二者相得益彰,大家可以具体情况酌情使用。偶数月的26号中午11点到下午1点,沙漠君的手机上就会收到一条短信,不是中介和广告,但内容肯定是一样的:“很遗憾,该编码本次摇号未中签或摇号资格已过期”。二姨妈真是比大姨妈都准时!呵呵!Data Guard是Oracle高可用性HA的重要解决方案。针对不同的系统保护需求,DG提供了三种不同类型的保护模式(Protection Mode)……2006年,Hinton等人第一次提出了“深度学习”的概念,发展至今,深度学习已经是当今科技圈最火最潮的词。但是,很多人知其然而不知其所以然,华为大数据算法专家涂丹丹在创客168的第七期活动中结合她的工作经历,分享了她对深度学习的独到见解。这是一个探讨怎样在多个MySQL服务器之间切分数据的技术问题。早在2012年我们就完成了这样分片方案,我们最近有一张2000W条记录的数据表需要优化和迁移。2000W数据对于MySQL来说很尴尬,因为合理的创建索引速度还是挺快的,再怎么优化速度也得不到多大提升……IT圈,这个在我印象里 严谨、缜密的行业,居然也有无数个“新世界的大门”。就拿数据中心来说吧,有些人居然一言不合,就把它们建到了这里,这里和这里……继深圳站主题活动之后,相信参会的朋友们各种经验&干货都是收获满满。现在机会又来了,9月23日CTO智库上海站活动已经开始报名啦!好激动有木有!在linux服务器下进行测试,如何才能将MySQL主从数据库同步?互联网时代,作为大数据应用的排头兵,推荐算法是一种广泛应用于各类互联网公司中、并获得显著成果的方法。本期创客168邀请阿里巴巴,饿了么等知名企业的大数据专家,围绕大数据与推荐算法进行深度分享。诸多知名大公司都在使用MySQL。虽然很难保持MySQL数据库高速运行,但面对数据堆积,可以通过一些性能调整,来使其继续工作。本文则将围绕这一问题展开讨论。生活的真相是什么?近日,网上对“一个程序员眼中的Fenng“”一文的关注度持续升温,当事人也在第一时刻于博客和微信公众号给出了回应。下面,小编带你“亲临现场”,看看当事人是如何对提出的质疑一一反驳的。业务背景按分组取出TOP值,是非常常见的业务需求。比如提取每位歌手的下载量TOP 10的曲目、提取每个城市纳客户原本是一套单机版的Oracle 11.2.0.3.0 Database for Windows的数据库系统,客户的需求是将单机版的Oracle Database迁移到3节点的Oracle RAC Database中“在移动互联网时代,CTO掌握的一种技术和能力,都切不可只关注技术本身,要知道技术只是这整个世界中的一块……ACID 是软件领域使用最广泛的技术之一,它是关系数据库的基石,是企业级中间件不可或缺的部分,但通常通过黑盒一、前言纳西姆.尼古拉斯.塔勒布的经典著作《黑天鹅》中对“黑天鹅现象”的定义是- 不可预测,人们事前往往低估这么久了坚持在运维工作岗位,说实话压力明显体现出来了特别是最近段时间!!!!!所以,你可能真的有如下体会:
————————本篇主要介绍Oracle vktm时间后台进程报警的Bug问题。本文主要分析总结了目前主流的几种MySQL集群架构实现方法及优缺点,现发出来以供大家参考学习、共同进步,如有不妥之处,请不吝赐教~现在的Oracle正在往智能化方向发展。如果我们现在找一些8i/9i时代的Oracle书籍,怎么样配置合适的数据库各内存池大小是非常重要的话题。但是进入10g之后,自动内存池调节成为一个重要Oracle特性。就在刚才,前台妹纸又通知我打印机坏了!what the fuсk!?爷不声不响的肩负起了全公司杂工使命,今天莫名看到了厕所大爷嘴角那一抹淡淡的笑!心塞ing。。。。。互联网时代,作为大数据应用的排头兵,推荐算法是一种广泛应用于各类互联网公司中、并获得显著成果的方法。本期创客168邀请阿里巴巴,饿了么等知名企业的大数据专家,围绕大数据与推荐算法进行深度分享。OCP知识点讲解 之 队列、资源与锁数据安全是现在互联网安全非常重要一个环节。而且一旦数据出现问题是不可逆的,甚至是灾难性的……在实际的工作中,数据科学家们不仅要学会如何实用工具,还要懂得如何与同事合作。The Yhat Blog这篇文在Oracle的11g版本中提供了统计数据自动收集的功能。在部署安装11g Oracle软件过程中,其中有一一、队列与共享资源共享资源可以被多个会话、进程同时访问,因此它的访问需要保护。Oracle中,除了PGA,所MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。面对每天成堆的技术文章,即便是爱技术的你,是不是也会有一丝乏味呢……今天,就让小编带你放松一下,咱们不聊技术,只谈“人生”~有请,“IT话聊师”登场!本文简单讨论Redis常见数据”丢失“现象,以及怎么规避;会列举几个生产中有意思的情节。先分享一个小故事(大家都喜欢带情节的片,不对是技术文章)……首先,我不是专业的DBA,我是做ebs的,工作中可以接触到db,但是不多,可以忽略。一直都想学习下DB。记得在2008年还是2009年的时候,买了一本老盖的书……在Oracle 11g版本的SQL*Plus中提供了一个非常有特色的选项errorlogging。当开启该选项之后,会话级别的错误都会写入到指定表中,是spool选项的有益补充。SQL tuning 类 1:列举几种表连接方式 hash join/merge join/nest looSQL语句优化技巧30条~围绕大数据平台架构及应用实践话题,本期【创客168】我们将邀请多位来自大数据领域相关的架构师及技术专家,从社交的角度,从金融的角度来分享大数据平台架构及应用的经验与心得,为面临海量数据压力的企业级用户提供参考。编者按:本文来源微信公号“智能研究所”(ID:HCR-TMT),作者慧辰资讯TMT研究部-张凤。“ 目前“人查看oracle服务端和客户端的字符集查看oracle数据库字符集select * from nls_dat锁与数据库的基本架构等紧密结合,涉及到内存管理、请求调度等其他相关技术。所以,从今天起,我们将发布系列的文章,介绍K-DB演进、K-DB基本架构、锁机制的构成、及锁的运行和测试数据等各个方面,让您对浪潮锁机制管理有全面的了解。前俩天客户有个oracle测试库hang住的问题,任谁也无法登陆进数据库,trace日志又一直不停的刷新错误,因为登不进去,做不了任何的操作和库内查询,最终依靠强制重启了事。本文将先介绍K-DB的基本架构,由此引出K-DB锁的存储管理、构成以及锁同数据库映射关系的建立等。前几天 Uber 发布了一篇文章 "为什么 Uber 工程师将 Postgres 数据库换成 MySQL?"我主要从MongoDB的架构和部署、物理机部署运维的痛点、我们如何Docker化MongoDB、Docker化MongoDB给我们带来的好处、以及使用docker的过程中碰到的一些坑这5个方面来展开对MongoDB的Docker化实践的讲述在阅读这篇文章之前,读者需要注意的是,为了维护隐私,用 MySQL 服务器的 D 段代替完整 IP,并且略去条条框框的报表页面枯燥乏味?不妨给页面加点“新意”!前阵子,在看天气预报的时候,发现免费天气预报的调用代码,Apache Spark在内存数据处理领域有很多创新。有了这个框架,你可以上传数据到集群内存,并在交互模式下以非常快的速度处理这些数据。itpuberITPUB官方账户,分享社区技术干货内容,了解社区最新动态,参与社区精彩活动。热门文章最新文章itpuberITPUB官方账户,分享社区技术干货内容,了解社区最新动态,参与社区精彩活动。40805人阅读
oracle(72)
一、什么是oracle字符集&
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。&
影响oracle数据库字符集最重要的参数是NLS_LANG参数。&
它的&#26684;式如下:   NLS_LANG = language_territory.charset&
它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。&
Language 指定服务器消息的语言,territory 指定服务器的日期和数字&#26684;式,charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK&
从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。&
所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。&
二.查看数据库字符集&
这涉及三方面的字符集,&
一是oracel server端的字符集;&
二是oracle client端的字符集;&
三是dmp文件的字符集。&
在做数据导入的时候,需要这三个字符集都一致才能正确导入。&
1、查询oracle server端的字符集&
有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种:&
SQL&select userenv(‘language’)&
结果类&#20284;如下:AMERICAN _ AMERICA. ZHS16GBK&
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也可以得到它对应的字符集。&
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字符。如果多个设置存在的时候,alter session&环境变量&注册表&参数文件&
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。&
三、修改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 /   若此时数据库服务器已启动,则先执行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 ZHS16GBK;&
SQL&ALTER DATABASE national CHARACTER SET ZHS16GBK;&
SQL&SHUTDOWN IMMEDIATE;&
SQL&STARTUP&
注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,不然不能start) 按上面的做法就可以,但是可能会出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 这样的提示信息&
要解决这个问题有两种方法&
一个是,利用INTERNAL_USE 关键字修改区域设置,&
还有一个是利用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的区域设置就没有问题&
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无法打开,就需要用程序的方法了
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:429345次
积分:4996
积分:4996
排名:第3914名
原创:109篇
转载:34篇
评论:19条
(2)(2)(1)(5)(2)(1)(1)(2)(5)(1)(6)(2)(5)(2)(15)(3)(2)(1)(7)(8)(14)(10)(4)(4)(11)(1)(11)(7)(8)

我要回帖

更多关于 服务器端和客户端 的文章

 

随机推荐