字符集不匹配问题一例

今天遇到了一个字符集方面的问题,在puber们的帮助下有了一定了解。衷心感谢!
内容如下:
 
在我的台式机上可以连接两个IP:
A:10.1.15.15   是公司使用的一台服务器
B:192.168.5.130  是我自己电脑上的一条虚拟机

分别用secureCRT登录A、B两个机器,查询一个不存在的表:
SQL> select * from ddd;
select * from ddd
              *
ERROR at line 1:
ORA-00942: table or view does not exist

报错相同。

如果在CMD命令行模式下执行,则
A机返回结果为:
SQL> select * from ddd;
select * from ddd
              *
第 1 行出现错误:
ORA-00942: 表或视图不存在

B机返回结果为:
SQL> select * from ddd;
select * from ddd
              *
第 1 行出现错误:
ORA-00942: ???????
 
此问题是由于我的电脑(客户端,以下称为M)与虚拟机(B)的字符集设置不匹配造成的。
M是windows xp系统。regedit进入注册表,路径:
 HKEY_LOCAL_MACHINE ->SOFTWARE ->ORACLE->KEY_OraDb10g_home2
双机右侧的NLS_LANG菜单项,得到的内容为“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”。
 
而进入到B机,执行命令
[oracle@localhost ~]$ echo $NLS_LANG
 
 
我们需要参照M的NLS_LANG设置B的NLS_LANG,该参数的格式为:
NLS_LANG=_.
B机的语言为:
[oracle@localhost ~]$ echo $LANG
en_US.UTF-8
[oracle@localhost ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Sat May 18 21:25:54 2013
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
idle> conn /as sysdba
Connected.
sys@TESTDB> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------------------------------------------------------
AMERICAN_AMERICA.WE8MSWIN1252
 
B机设定的地区和语言是美国,我们将其字符集设置为 ZHS16GBK。
[oracle@localhost ~]$ export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
[oracle@localhost ~]$ echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
 
若将国家和语言改错了,会报错:
[oracle@localhost ~]$ export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZH16GBK"
[oracle@localhost ~]$ echo $NLS_LANG
SIMPLIFIED CHINESE_CHINA.ZH16GBK
[oracle@localhost ~]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 星期六 5月 18 21:18:47 2013
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
idle> conn /as sysdba
ERROR:
ORA-12705: 无法访问 NLS 数据文件, 或者指定的环境无效
 
即使按照客户端M设置了服务器B的字符集,再从M机上进行查询不存在的表,报错信息仍是???。
 
另外,如果B机上的字符集与M机上的字符集存在超集关系,即B机字符集的所有字符在M机上都有对应表示,不会出现乱码,也可以直接在B机上执行alter database character set 命令。由于本例中不存在这种超集关系,会报错:
sys@TESTDB> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@TESTDB> startup mount;
ORACLE instance started.
Total System Global Area  405929984 bytes
Fixed Size                  1336848 bytes
Variable Size             306186736 bytes
Database Buffers           92274688 bytes
Redo Buffers                6131712 bytes
Database mounted.
sys@TESTDB>  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
 
尝试了以下表中的修改:
B机数据库languageB机NLS_LANG客户端M的NLS_LANG报错信息备注
AMERICAN_AMERICA.WE8MSWIN1252xxxxxxx(错误的设置)SIMPLIFIED CHINESE_CHINA.ZHS16GBKORA-00942: ???????仅oracle报错乱码
AMERICAN_AMERICA.WE8MSWIN1252AMERICAN_AMERICA.ZHS16GBKxxxxxxORA-12705: 无法访问 NLS 数据文件, 或者指定的环境无效登录报错
AMERICAN_AMERICA.WE8MSWIN1252AMERICAN_AMERICA.ZHS16GBKSIMPLIFIED CHINESE_CHINA.ZHS16GBKORA-00942: ???????仅oracle报错乱码
AMERICAN_AMERICA.WE8MSWIN1252AMERICAN_AMERICA.WE8MSWIN1252SIMPLIFIED CHINESE_CHINA.ZHS16GBKORA-00942: ???????仅oracle报错乱码
AMERICAN_AMERICA.WE8MSWIN1252AMERICAN_AMERICA.WE8MSWIN1252SIMPLIFIED CHINESE_CHINA.WE8MSWIN1252?1 靠靠?
ORA-00942: 靠靠靠
其他提示信息也全部是乱码
AMERICAN_AMERICA.WE8MSWIN1252AMERICAN_AMERICA.WE8MSWIN1252AMERICAN_AMERICA.WE8MSWIN1252ORA-12705: Cannot access NLS data files or invalid environment specified登录报错
AMERICAN_AMERICA.WE8MSWIN1252SIMPLIFIED CHINESE_CHINA.ZHS16GBKSIMPLIFIED CHINESE_CHINA.ZHS16GBKORA-00942: ???????仅oracle报错乱码
 
只有在服务器端操作系统字符集与数据库字符集匹配(相同或操作系统字符集为数据库字符集的超集),语言设置一致;并且客户端的字符集与服务器字符集一致时,才会正常显示。否则就有可能乱码或无法登陆。
因此还是应该一步步确保没错误。服务器B的数据库字符集是西文特有的,而客户端M语言设置为中文,因此无论如何也无法将两者完全对应起来,肯定是要有乱码了。
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26451536/viewspace-764893/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26451536/viewspace-764893/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值