Oracle诡异结果调查备忘 - A investigation memo of weird Oracle database search results
最近需要维护一个差不多十多年前开发的ASP.Net程序,遇到了各种奇奇怪怪的问题,把其中比较难查明的问题记录如下:
问题一:
同样的SQL查询在不同服务器上查询结果不同。在QA环境下,结果完全正常,而在本地,部分字段值为DBNull。
这是一个很诡异的问题,当时唯一发现的规律是,出现DBNull值的字段为Clob类型。ASP.Net连接数据库的方式为OleDb,链接字符串中“Provider=OraOLEDB.Oracle.1”。
首先换为OracleClient,查询结果正常,问题似乎出在OleDb上。网上也有关于Clob类型的一些资料,但是为什么QA服务器上又没问题呢。
带着这个问题,我做了一个能通过.Net里不同Client执行Sql查询的小工具,放到QA服务器上运行,结果确实是正常的。
QA服务器的环境为32位,Oracle客户端主版本为10,我自己的电脑环境为32位,Oracle客户端主版本为11。
接着我在几个服务器上尝试,结果都正常。我开始怀疑自己电脑上的Oracle客户端安装不正常,于是卸载重装,结果依旧。
对照注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\2.112.1.0
发现键值完全一致。这时我开始怀疑是32位与64位的差异。因为之前测试过的服务器都是64位的,只有QA环境是32位,而QA环境又是10版本的客户端。
最后找到了一台32位环境的服务器,客户端版本为11,问题重现。
因此推测,OleDb查询Clob字段的问题是在32位系统上运行32位客户端造成的,64位系统上的64位客户端似乎都不存在这个问题。至于64位系统上的32位客户端是否存在这个问题,因为时间关系就不亲自验证了。而该问题似乎与服务器无关,因为在32位和64位服务器上都会重现这个问题。
因此,这个问题可以重新描述:使用32位系统下的32位Oracle Provider for OLE DB查询含有Clob字段类型的数据时可能得到假空值的结果。
解决方式有两种,使用OracleClient类访问数据库或者使用Provider=msdaora;的方式访问数据库,这其实是一样的方法,都是使用Microsoft OLE DB Provider for Oracle;
另一种解决方式就是将服务器升级为64位环境,并尽可能安装64位客户端。目前来看应该是Oracle Provider for OLE DB在处理字符编码时的Bug。
[2016/5/5问题一补充:因为系统环境不同,这个问题可能不一定会重现,目前已知会影响重现的因素是注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_OraClient11g_home1下NLS_LANG的值。当系统区域和语言选项中,格式选择为中国,则该值默认为SIMPLIFIED CHINESE_CHINA.XXXX,这种情况下查询结果正常。若系统区域和语言选项中,格式为美国,则NLS_LANG的值默认为AMERICAN_AMERICA.WE8MSWIN1252,这种情况才会出现这个问题。目前没有发现这个问题跟服务器端的NLS_LANG值有关。]
问题二:
有西班牙语特殊字符的查询结果在不同服务器上查询结果显示不同,本地执行有乱码,QA服务器正常。
这个问题也纠结了挺久,在各种尝试无果后想到了一个控制面板的配置项:在"Region and Language"配置项的管理员选项卡中有一个"Language for non-Unicode programs"选项。之前为了运行某些没有使用Unicode编码的国产软件时将这个配置项改为了中文,我的系统本来是英文版的。于是将这个选项改回英文,问题解决。
因此,这个问题可以重新描述:使用Oracle Provider for OLE DB查询含有非Unicode编码字段内容时,若系统的非Unicode语言选项不正确,会导致查询结果编码不正确的问题。
Oracle诡异结果调查备忘 - A investigation memo of weird Oracle database search results的更多相关文章
- ORACLE 连接SQLSERVER 数据库备忘
最近工作需要,要从SQL SERVER数据库中同步提取数据. 这里采用了 Oracle Gateway 来连接,折腾了半天,终于搞定,记录下已备下次使用. 基本资料网上都可以搜很多,官网配置说明在这 ...
- Oracle用法、函数备忘记录
Listagg select * from emp select LISTAGG(ename,'-') within group (order by deptno desc) from emp; 可以 ...
- 项目中oracle存储过程记录——经常使用语法备忘
项目中oracle存储过程记录--经常使用语法备忘 项目中须要写一个oracle存储过程,需求是收集一个复杂查询的内容(涉及到多张表),然后把符合条件的记录插入到目标表中.当中原表之中的一个的日期字段 ...
- Oracle使用备忘
初学Oracle,很多语句记不住,写在这里备忘. 1.查看某表空间的数据文件 select file_name 文件名, tablespace_name 表空间名, bytes 已使用大小M, max ...
- oracle下 启动subversion命令 及 oracle相关服务启动备忘
linux shell下 svnserve - d -r + 目录 例如:svnserve -d -r /svn 启动 svn服务. 访问svn://192.168.0.120/kjcg 测试. ...
- centos 6.4 mysql rpm 离线安装【备忘】
离线状态下使用rpm的安装包进行mysql的安装,仅作备忘 准备工作: 官网下载mysql离线rpm安装包(这里就不演示了,拿现成的做演示) =================更新线 2018-01- ...
- JVM内存知识备忘
又是一篇备忘... 主要记录一些知识,进行一些资源的汇总. 先来群里liufor大大提供的两张图,清晰易懂: Dockerized Java https://www.youtube.com/watch ...
- 工作T-SQL备忘
作为一个"浸淫" Oracle 数据库很久的人来说, 突然转入 T-SQL, 也就是 MSSQL , 工作中经常用的查询和 MSMS 使用备忘如下 : --1. 切换对应的库连接 ...
- Annotation 使用备忘
title: Annotation 使用备忘 date: 2016-11-16 23:16:43 tags: [Annotation] categories: [Programming,Java] - ...
随机推荐
- Kali Linux additional tools setup
The steps are pretty straight forward. The only tool that might cause some confusion is SMBexec. Thi ...
- @SuppressWarnings("deprecation")
在Java编译过程中会出现很多警告,有很多是安全的,但是每次编译有很多警告影响我们对error的过滤和修改,我们可以在代码中加上 @SuppressWarnings("XXXX") ...
- C++ operator 的一种不会的用法
自认为对C++比较熟悉,突然看到一些奇怪的代码(在看网上下载的代码Sockets): class SocketAddress { public: virtual ~SocketAddress() {} ...
- Qt开发中的实用笔记三--关于各种类的零碎知识点:
1,QUuid()创建唯一标识码,在创建数据库实体ID和链接数据库QSqlDatabase时非常方便 2,QScrollArea与QScrollBar,如果是要在widget中添加窗口滑动QScrol ...
- [2014.01.27]wfTextImage 文字图像组件 1.6
全新开发的文字转图像组件--wfTextImage,使用简单,功能强大,图像处理效果极佳. 将大段的文本内容转换成GIF图片. 有效防止文字内容被复制抄袭,有效保护文字资料. ...
- 认识UML类图元素
在Visio里,包和类的关系是包含关系,将类拖入包的文件夹之后,关系就建立了,二元关联符号可以设置为:聚合.合成.接口:空心圆+直线(唐老鸭类实现了‘讲人话’):依赖:虚线+箭头(动物和空气的关系): ...
- svn 权限配置
svnserve.conf开启权限 auth中以下设置 重启SVN服务
- 监控服务 - Nagios配置文件详解
Nagios的配置文件: Nagios安装后有四种默认的配置文件:主配置文件.CGI配置文件.资源定义文件.对象定义文件.这些配置文件间具有一些关系,只有充分理解各配置文件,才能使得配置Nagios服 ...
- 在VBA中使用Windows API
VBA是一种强大的编程语言,可用于自定义Microsoft Office解决方案.通过使用VBA处理一个或多个Office应用程序对象模型,可以容易地修改Office应用程序的功能或者能够使两个或多个 ...
- sql查询单个银行账号重复
非一单位多银行账号. 今天成都公司熊娇付款时候单位名称在弹出的网银补录变成1,从开户银行看都是正常的,只是在分子公司集团这边点击修改开户银行保存就提示错误“银行账号不能重复” select * fro ...