201926 关于Oracle显示中文乱码(问号)

哇,第一次遇到这样的情况,花费了自己很多精力,其实,自己努力的方向错了。。

问题表象
在plsql端,去别的数据库查看数据,中文能够正常显示。但是,有一个数据库,可能搭建的时间有点早,2007年左右,查询里面的数据,中文显示为乱码。
我当时的思路是,别的数据库的数据都能正常查看,就这个不能。
说明:
1.别的数据库的Server端设置没问题。
2.我这边客户端Client设置也没问题。
问题肯定出在这个数据库的服务器端了。
于是,当时,蠢蠢的我,就在试图修改服务器端的字符集,改来改去,都没能成功!

需要指出,不要试图修改服务器端的字符集!
不要试图修改服务器端的字符集!!!
其实,这个也能理解,服务器是源头,是根本啊。。。

切入正题
一、先查看服务器端的字符集:
select * from nls_database_parameters; 得到:
在这里插入图片描述
根据第2行、第3行、第7行 拼接后,得到完整的nls_lang 为: AMERICAN_AMERICA.US7ASCII

二、下面介绍客户端的字符集设置

如果,你的Oracle版本在10g及以上,
那么,在你的注册表里有类似这样的路径:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<oracle_home_name>
KEY_<oracle_home_name> 一般为 home0 或者 home1 字样
这里您会看到一个条目名为NLS_LANG,将其
设置为 AMERICAN_AMERICA.US7ASCII即可。

如果你是在64位windows平台上安装32位软件,会使用32位兼容性路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_<oracle_home_name>
找到NLS_LANG条目,设置为 AMERICAN_AMERICA.US7ASCII即可。

当然,如果你没找到这个路径,也不需要慌张,直接到你电脑的–属性–高级系统设置–环境变量–系统变量
下,添加一个 nls_lang 变量(用户变量和系统变量都可以):
在这里插入图片描述
这样,将客户端和服务器端设置为一样后,查询该服务器端的数据时,中文就能正常显示了~

当然, 如果你要查别的数据库里的数据,nls_lang还要再修改回去哦~~
修改为此前的:SIMPLIFIED CHINESE_CHINA.ZHS16GBK.

Jerry一再教导
客户端编码跟服务端编码一致可能就显示正常了,但是不推荐这么做。
中文环境应该使用ZHS16GBK字符集,下次建库的时候要注意。
us7ascii主要针对英文环境,西方国家设置的,亚洲国家基本不会使用这个编码。

有人不禁要问:
为何oracle还可以显示出ascii字符集里边的中文呢?
因为在oracle里边将数据原封不动的存储,即按字节原封不动的存储,当读取的时候,根据里边的内容和当前终端的字符集就可以将数据正常显示了。

扫描二维码关注公众号,回复: 8754901 查看本文章

核心核心
要想正确显示中文,
让客户端编码去靠拢服务端编码!!!
设置客户端编码与服务端编码一致!!!

发布了83 篇原创文章 · 获赞 18 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/Partner2016/article/details/90767278
今日推荐