Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35406
  • 博文数量: 6
  • 博客积分: 156
  • 博客等级: 入伍新兵
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-05 11:12
文章分类

全部博文(6)

文章存档

2012年(6)

我的朋友

分类: LINUX

2012-12-13 13:45:20

    最近由于工作需要,经常需要使用SecureCRT连接到linux上,发现中文显示的有问题:
a.查看linux环境编码,选择UTF-8编码方式

  1. [oracle@local~]$echo $LANG
  2. en_US.UTF-8
b.修改会话设置

字体选择支持中文字符的,这里选择Fixedsys, 编码选择UTF-8,保存到Session里后,下次就不会变了。
3.测试下效果:
a.命令行, 正常:

  1. [oracle@local~]$echo '中国人'
  2. 中国人
b.vi编辑文件,正常:

  1. [oracle@local~]$vi t
  2. 中国
  3. ~
  4. ~
  5. ~
  6. ~
c.常用工具,sqlplus:

  1. SQL> select '中国' from dual;
  2. '?????
  3. ------
  4. ??????
  5. SQL>
出现问题了。

4. 查看oracle服务端编码设置:

  1. SQL> col parameter for a35
  2. SQL> col value for a35
  3. SQL> select * from v$nls_parameters;
  4. PARAMETER VALUE
  5. ----------------------------------- -----------------------------------
  6. NLS_LANGUAGE AMERICAN
  7. NLS_TERRITORY AMERICA
  8. NLS_CURRENCY $
  9. NLS_ISO_CURRENCY AMERICA
  10. NLS_NUMERIC_CHARACTERS .,
  11. NLS_CALENDAR GREGORIAN
  12. NLS_DATE_FORMAT DD-MON-RR
  13. NLS_DATE_LANGUAGE AMERICAN
  14. NLS_CHARACTERSET ZHS16GBK
  15. NLS_SORT BINARY
  16. NLS_TIME_FORMAT HH.MI.SSXFF AM
  17. PARAMETER VALUE
  18. ----------------------------------- -----------------------------------
  19. NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
  20. NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
  21. NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
  22. NLS_DUAL_CURRENCY $
  23. NLS_NCHAR_CHARACTERSET AL16UTF16
  24. NLS_COMP BINARY
  25. NLS_LENGTH_SEMANTICS BYTE
  26. NLS_NCHAR_CONV_EXCP FALSE
  27. 19 rows selected.
5.编辑oracle账户下的.bash_profile, 添加:

  1. export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
生效后,再登陆sqlplus测试:

  1. SQL> select '中国' from dual;
  2. '中国
  3. ------
  4. 中国
  5. SQL>
再测试:

  1. SQL> select '中国人' from dual;
  2. ERROR:
  3. ORA-01756: quoted string not properly terminated
  4. SQL>
新问题出现了:输入奇数字符串,会报ORA-01756的错误。
进一步分析原因,前面为了让SecureCRT能够显示中文,将客户端字符编码格式定义为UTF-8。UTF-8编码一个中文字符用3个字节来表示。在NLS_LANG中Characterset根据数据库定义,设置为ZHS16GBK,GBK编码一个中文字符用2个字节来表示,可以通过以下语句验证:

  1. SQL> select lengthb('中国') from dual;
  2. LENGTHB('中国')
  3. ----------------
  4. 6
  5. SQL>

6.调整NLS_LANG参数设置:

  1. export NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF8"
测试效果:

  1. SQL> select '中国人' from dual;
  2. '中国人'
  3. ------------------
  4. 中国人
  5. SQL> select '中国' from dual;
  6. '中国'
  7. ------------
  8. 中国
  9. SQL>
看来问题解决,建表验证一下:

  1. SQL> create table t(id int,name varchar2(10));
  2. Table created.
  3. SQL> insert into t values(1,'中国');
  4. 1 row created.
  5. SQL> insert into t values(1,'中国人');
  6. 1 row created.
  7. SQL> select * from t;
  8. ID NAME
  9. ---------- ------------------------------
  10. 1 中国
  11. 1 中国人
  12. SQL>
right!!!


阅读(2081) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~