SqlServer跨库查询Oracle表数据中文乱码

标题 SqlServer通过Openquery查询Oracle数据库表,中文乱码,显示为实体菱形中间带问号 。

SqlServer本身表查询中文正常显示,SqlServer排序规则为:Chinese_PRC_CS_AS,SqlServer服务器上用PLSQL Developer中查询Oracle表结果中文正常显示。
PLSQL中查询Oracle的字符集:
select userenv('language') from dual

结果:SIMPLIFIED CHINESE_CHINA.US7ASCII


select * from V$NLS_PARAMETERS

parameter项为NLS_LANGUAGE对应的VALUE值为:SIMPLIFIED CHINESE
已设置服务器环境变量 NLS_LANG : SIMPLIFIED CHINESE_CHINA.US7ASCII,此服务器也是SqlServer服务器。
我想要达到的结果:

Select * From Openquery(ts,'select * from test'

中文正常显示

把环境变量NLS_LANG修改成 SIMPLIFIED CHINESE_CHINA.ZHS16GBK 或者 SIMPLIFIED CHINESE_CHINA.AL32UTF8试试,
"SIMPLIFIED CHINESE"这个东西与字符集没很大关系,后面的"US7ASCII"这个才是字符集,
并且,通过sql是无法查到oracle数据库服务端的字符集的,这个只能看配置文件,但客户端查询是否乱码与Oracle数据库端的字符集本身关系真不大。
还有,”PLSQL Developer“如果开启了unicode,会自动给你转换成可以识别的字符集数据,因此不能用来判断是否存在乱码问题
更多关于oracle字符集的分析,可以看我这篇文章

--
你这样查的字符集NLS_CHARACTERSET,其实就是你在环境变量NLS_LANG里设置的字符集。你可以尝试把环境变量改了后,再重新连接ORACLE执行这个查询,会发现NLS_CHARACTERSET变成了你修改后的字符集。Oracle数据库里并没有提供任何用sql查询的方式来查询数据库的字符集,网上有些文章说的用sql查oracle数据库端字符集的都是错的。
至于plsql developer里,勾上unicode就能正常显示中文了

img

我觉得你可能得先判断一下原始数据本身是不是已经出现字符集错误的情况了,plsqldev能正常显示,并不代表此时数据的字符集就是正确的,在我上面那篇文章中也有举例

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632