今天遇到了一个字符集方面的问题,在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: ???????
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机的语言为:
B机的语言为:
[oracle@localhost ~]$ echo $LANG
en_US.UTF-8
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.
USERENV('LANGUAGE')
----------------------------------------------------------------------------------------------------
AMERICAN_AMERICA.WE8MSWIN1252
----------------------------------------------------------------------------------------------------
AMERICAN_AMERICA.WE8MSWIN1252
B机设定的地区和语言是美国,我们将其字符集设置为
ZHS16GBK。
即
[oracle@localhost ~]$ export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
[oracle@localhost ~]$ echo $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 ~]$ 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
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 数据文件, 或者指定的环境无效
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.
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
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博客 ” ,链接:http://blog.itpub.net/26451536/viewspace-764893/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26451536/viewspace-764893/