最近由于工作需要,经常需要使用SecureCRT连接到linux上,发现中文显示的有问题:
a.查看linux环境编码,选择UTF-8编码方式
- [oracle@local~]$echo $LANG
- en_US.UTF-8
b.修改会话设置
字体选择支持中文字符的,这里选择Fixedsys, 编码选择UTF-8,保存到Session里后,下次就不会变了。
3.测试下效果:
a.命令行, 正常:
- [oracle@local~]$echo '中国人'
- 中国人
b.vi编辑文件,正常:
- [oracle@local~]$vi t
- 中国
- ~
- ~
- ~
- ~
c.常用工具,sqlplus:
- SQL> select '中国' from dual;
- '?????
- ------
- ??????
- SQL>
出现问题了。
4. 查看oracle服务端编码设置:
- SQL> col parameter for a35
- SQL> col value for a35
- SQL> select * from v$nls_parameters;
- PARAMETER VALUE
- ----------------------------------- -----------------------------------
- NLS_LANGUAGE AMERICAN
- NLS_TERRITORY AMERICA
- NLS_CURRENCY $
- NLS_ISO_CURRENCY AMERICA
- NLS_NUMERIC_CHARACTERS .,
- NLS_CALENDAR GREGORIAN
- NLS_DATE_FORMAT DD-MON-RR
- NLS_DATE_LANGUAGE AMERICAN
- NLS_CHARACTERSET ZHS16GBK
- NLS_SORT BINARY
- NLS_TIME_FORMAT HH.MI.SSXFF AM
- PARAMETER VALUE
- ----------------------------------- -----------------------------------
- NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
- NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
- NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
- NLS_DUAL_CURRENCY $
- NLS_NCHAR_CHARACTERSET AL16UTF16
- NLS_COMP BINARY
- NLS_LENGTH_SEMANTICS BYTE
- NLS_NCHAR_CONV_EXCP FALSE
- 19 rows selected.
5.编辑oracle账户下的.bash_profile, 添加:
- export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
生效后,再登陆sqlplus测试:
- SQL> select '中国' from dual;
- '中国
- ------
- 中国
- SQL>
再测试:
- SQL> select '中国人' from dual;
- ERROR:
- ORA-01756: quoted string not properly terminated
- SQL>
新问题出现了:输入奇数字符串,会报ORA-01756的错误。
进一步分析原因,前面为了让SecureCRT能够显示中文,将客户端字符编码格式定义为UTF-8。UTF-8编码一个中文字符用3个字节来表示。在NLS_LANG中Characterset根据数据库定义,设置为ZHS16GBK,GBK编码一个中文字符用2个字节来表示,可以通过以下语句验证:
- SQL> select lengthb('中国') from dual;
- LENGTHB('中国')
- ----------------
- 6
- SQL>
6.调整NLS_LANG参数设置:
- export NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF8"
测试效果:
- SQL> select '中国人' from dual;
- '中国人'
- ------------------
- 中国人
- SQL> select '中国' from dual;
- '中国'
- ------------
- 中国
- SQL>
看来问题解决,建表验证一下:
- SQL> create table t(id int,name varchar2(10));
- Table created.
- SQL> insert into t values(1,'中国');
- 1 row created.
- SQL> insert into t values(1,'中国人');
- 1 row created.
- SQL> select * from t;
- ID NAME
- ---------- ------------------------------
- 1 中国
- 1 中国人
- SQL>
right!!!
阅读(2125) | 评论(0) | 转发(0) |