设为首页 收藏本站
查看: 587|回复: 0

[经验分享] oracle sqlplus相关知识

[复制链接]

尚未签到

发表于 2018-9-13 09:18:20 | 显示全部楼层 |阅读模式
  1、sqlplus连接oracle乱码  (转自:http://blog.csdn.net/nini1109/article/details/4158796)
  RedHat linux AS4.0安装了oracle10g,同时创建数据库实例sc,后来又用dbca建立一个数据库实例st,发现在oracle系统用户下用sqlplus连接st实例时出现乱码,应该是中文无法显示造成的,但连接sc实例时无乱码,显示英文。上网搜集了一下资料,修改了oracle系统用户的环境变量在.bash_profile中新增了以下内容解决:
  export NLS_LANG=AMERICAN_AMERICA.UTF8
  export LANG=en_US.UTF-8
  分析原因:
  引用网上帖子:
  oracle字符集问题一般可以分为三类: 数据库字符集, sqlplus的字符集(客户端字符集), 终端程序的字符集(非oracle的)。
  1、数据库字符集。
  数据库字符集是所有字符问题的核心,只有数据库本身的字符集正确了,客户端的字符集才可能正确。这里只的客户端包括sqlplus以及我们自己读数据库的应用程序。
  在定位问题时,我们需要先看看数据库当前是什么字符集。
  1)查询数据库字符集
  select * from nls_database_parameters
  其中 nls_language表示了显示方式, 就是sqlplus的程序的显示字体,有SIMPLIFIED CHINESE,American america
  其中  nls_characterset是字符集设定, 常用的一些字符集有UTF8,US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK, AL32UTF8
  2)修改数据库字符集
  当发现数据库字符集不正确时,如我们期望时GBK的,而数据库当前是其他的,从而引起中文乱码。这时我们需要修改数据库字符集。步骤如下:
  $sqlplus /nolog
  SQL>conn / 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 ZHS16GBK;
  SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;
  SQL>SHUTDOWN IMMEDIATE;
  SQL>STARTUP
  2 客户端字符集
  如果服务器端的字符集是正确的,而在客户端下,如sqlplus仍然不能正确显示中文,这一般是由于服务器端的字符集设定与客户端的字符集设定不同造成的。只要将两者修改一致就可以解决问题。
  1)查询客户端字符集
  select * from nls_instance_parameters
  客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,
  表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
  select userenv('language') from dual;
  会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
  客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件
  字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。  或者.zhs16gbk。注意zhs16gbk前面那个点是必须的哦!!
  2) 修改客户端字符集
  oracle 的sqlplus会去读取OS中环境变量下的nls_lang信息(关键在这里,通过以上命令查看
  select * from nls_database_parameters 显示
  NLS_LANGUAGE                   AMERICAN
  NLS_TERRITORY                  AMERICA
  NLS_CURRENCY                   $
  select * from nls_instance_parameters 显示
  NLS_LANGUAGE                   SIMPLIFIED CHINESE
  NLS_TERRITORY                  CHINA
  NLS_SORT
  NLS_DATE_LANGUAGE
  NLS_DATE_FORMAT
  NLS_CURRENCY
  select * from nls_session_parameters 显示
  NLS_LANGUAGE                   SIMPLIFIED CHINESE
  NLS_TERRITORY                  CHINA
  NLS_CURRENCY                   RMB
  也就是说会话字符集与终端字符集一致,而与数据库字符集设置不一致。
  另一个数据库实例sc
  数据库字符集
  select * from nls_database_parameters 显示
  NLS_LANGUAGE                   AMERICAN
  NLS_TERRITORY                  AMERICA
  NLS_CURRENCY                   $
  select * from nls_instance_parameters 显示
  NLS_LANGUAGE                   AMERICAN
  NLS_TERRITORY                  AMERICA
  NLS_SORT
  NLS_DATE_LANGUAGE
  NLS_DATE_FORMAT
  NLS_CURRENCY
  在linux下
  select * from nls_session_parameters 显示
  NLS_LANGUAGE                   AMERICAN
  NLS_TERRITORY                  AMERICA
  用TOD 在windows下显示
  NLS_LANGUAGE                   SIMPLIFIED CHINESE
  NLS_TERRITORY                  CHINA
  NLS_CURRENCY                   RMB
  这个我还搞不明白为什么windows与linux会话字符集为什么不一样。
  更搞不明白的是为什么两个数据库实例用同一个系统用户查询的,也就是说环境变量是一样的,但查询结果终端字符集为什么会不一样?初步分析(当然不一定对,欢迎指正)是两个数据库实例的参数文件不一致引起的,因为alter session>环境变量>注册表>参数文件,也就是说因为环境变量没有设置,但sc与st数据库实例参数文件不同,但是参数文件在什么地方设还不清楚,有高手欢迎指点!
  但基本上问题锁定是因为终端字符集与数据库字符集不一致引起,在用户的环境变量中增加
  export NLS_LANG=AMERICAN_AMERICA.UTF8
  export LANG=en_US.UTF-8
  问题解决
  再次查看客户端字符集
  select * from nls_instance_parameters 还是显示
  NLS_LANGUAGE                   SIMPLIFIED CHINESE
  NLS_TERRITORY                  CHINA
  NLS_SORT
  NLS_DATE_LANGUAGE
  NLS_DATE_FORMAT
  NLS_CURRENCY
  但
  select * from nls_session_parameters 显示
  NLS_LANGUAGE        AMERICAN
  NLS_TERRITORY         AMERICA
  NLS_CURRENCY         $
  看来只要本次会话字符集正确就没问题了,经过验证确实如此,用
  alter session set NLS_LANGUAGE=‘AMERICAN’后本次会话也不会出现乱码的。
  )
  NSL_LANG包括三个部分(语言_地区.字符集)就是V$NLS_PARAMETERS表中的NLS_LANGUAGE,NLS_TERRITORY,NLS_CHARACTERSET
  例如可以在cmd中键入
  set nls_lang="Simplified chinese_china.utf8"
  set nls_lang="american_america.us7ascii"
  set nls_lang="american_america.zhs16gbk"
  set nls_lang="Simplified chinese_china.zhs16gbk"
  set nls_lang=".utf8"
  set nls_lang=".zhs16gbk"
  set nls_lang=".us7ascii"
  unix下类似, 不过nls_lang要大写NLS_LANG, 在.profile或这.bash_profile(根据你用的shell)里更改NLS_LANG可以长久保持环境变量值.
  3、终端字符集
  如果数据库字符集和sqlplus的字符集一致, 还是不能正确显示了, 那很可能就是你的终端应用程序的字符集不支持了. 例如你用bash登陆sqlplus, 如果你的bash是个小字符集, 那么就不能正常显示了.linux修改bash的字符集, 可以先键入locale, 看有哪些环境变量, 再用export设置.


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-577418-1-1.html 上篇帖子: oracle数据文件的一次恢复经历 下篇帖子: oracle数据库深入(三)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表