ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 字符集不匹配问题一例

字符集不匹配问题一例

原创 Linux操作系统 作者:to_be_dba 时间:2013-06-26 20:40:57 0 删除 编辑
今天遇到了一个字符集方面的问题,在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机数据库language B机NLS_LANG 客户端M的NLS_LANG 报错信息 备注
AMERICAN_AMERICA.WE8MSWIN1252 xxxxxxx(错误的设置) SIMPLIFIED CHINESE_CHINA.ZHS16GBK ORA-00942: ??????? 仅oracle报错乱码
AMERICAN_AMERICA.WE8MSWIN1252 AMERICAN_AMERICA.ZHS16GBK xxxxxx ORA-12705: 无法访问 NLS 数据文件, 或者指定的环境无效 登录报错
AMERICAN_AMERICA.WE8MSWIN1252 AMERICAN_AMERICA.ZHS16GBK SIMPLIFIED CHINESE_CHINA.ZHS16GBK ORA-00942: ??????? 仅oracle报错乱码
AMERICAN_AMERICA.WE8MSWIN1252 AMERICAN_AMERICA.WE8MSWIN1252 SIMPLIFIED CHINESE_CHINA.ZHS16GBK ORA-00942: ??????? 仅oracle报错乱码
AMERICAN_AMERICA.WE8MSWIN1252 AMERICAN_AMERICA.WE8MSWIN1252 SIMPLIFIED CHINESE_CHINA.WE8MSWIN1252 ?1 靠靠?
ORA-00942: 靠靠靠
其他提示信息也全部是乱码
AMERICAN_AMERICA.WE8MSWIN1252 AMERICAN_AMERICA.WE8MSWIN1252 AMERICAN_AMERICA.WE8MSWIN1252 ORA-12705: Cannot access NLS data files or invalid environment specified 登录报错
AMERICAN_AMERICA.WE8MSWIN1252 SIMPLIFIED CHINESE_CHINA.ZHS16GBK SIMPLIFIED CHINESE_CHINA.ZHS16GBK ORA-00942: ??????? 仅oracle报错乱码
 
只有在服务器端操作系统字符集与数据库字符集匹配(相同或操作系统字符集为数据库字符集的超集),语言设置一致;并且客户端的字符集与服务器字符集一致时,才会正常显示。否则就有可能乱码或无法登陆。
因此还是应该一步步确保没错误。服务器B的数据库字符集是西文特有的,而客户端M语言设置为中文,因此无论如何也无法将两者完全对应起来,肯定是要有乱码了。
 

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

请登录后发表评论 登录
全部评论

注册时间:2011-11-23

  • 博文量
    170
  • 访问量
    484886