最近需要维护一个差不多十多年前开发的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\KEY_OraClient11g_home1\OLEDB 

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的更多相关文章

  1. ORACLE 连接SQLSERVER 数据库备忘

    最近工作需要,要从SQL SERVER数据库中同步提取数据. 这里采用了  Oracle Gateway 来连接,折腾了半天,终于搞定,记录下已备下次使用. 基本资料网上都可以搜很多,官网配置说明在这 ...

  2. Oracle用法、函数备忘记录

    Listagg select * from emp select LISTAGG(ename,'-') within group (order by deptno desc) from emp; 可以 ...

  3. 项目中oracle存储过程记录——经常使用语法备忘

    项目中oracle存储过程记录--经常使用语法备忘 项目中须要写一个oracle存储过程,需求是收集一个复杂查询的内容(涉及到多张表),然后把符合条件的记录插入到目标表中.当中原表之中的一个的日期字段 ...

  4. Oracle使用备忘

    初学Oracle,很多语句记不住,写在这里备忘. 1.查看某表空间的数据文件 select file_name 文件名, tablespace_name 表空间名, bytes 已使用大小M, max ...

  5. oracle下 启动subversion命令 及 oracle相关服务启动备忘

    linux shell下  svnserve - d -r + 目录   例如:svnserve -d -r /svn 启动 svn服务. 访问svn://192.168.0.120/kjcg 测试. ...

  6. centos 6.4 mysql rpm 离线安装【备忘】

    离线状态下使用rpm的安装包进行mysql的安装,仅作备忘 准备工作: 官网下载mysql离线rpm安装包(这里就不演示了,拿现成的做演示) =================更新线 2018-01- ...

  7. JVM内存知识备忘

    又是一篇备忘... 主要记录一些知识,进行一些资源的汇总. 先来群里liufor大大提供的两张图,清晰易懂: Dockerized Java https://www.youtube.com/watch ...

  8. 工作T-SQL备忘

    作为一个"浸淫" Oracle 数据库很久的人来说, 突然转入 T-SQL, 也就是 MSSQL , 工作中经常用的查询和 MSMS 使用备忘如下 : --1. 切换对应的库连接 ...

  9. Annotation 使用备忘

    title: Annotation 使用备忘 date: 2016-11-16 23:16:43 tags: [Annotation] categories: [Programming,Java] - ...

随机推荐

  1. 使用cordova插件barcodescanner遇到的坑

    最近接手了一个app任务,由于不懂android和ios,只想简单点写代码,所以,最终采用了基于H5的web框架:ionic + cordova(也叫phonegap)来开发.app的设计中有一个扫描 ...

  2. Lua 中string.gsub(sourceString, pattern, replacementString) 返回值有两个

    这阵子在学习lua,今天看到string操作,书中描述string.gsub(sourceString, pattern, replacementString)返回一个字符串,但是我在实际操作中却发现 ...

  3. 程序员写的东西出了bug,造成了损失谁来承担?

    这是个持续多年的话题了,很多大公司,尤其是牛逼的独立分包公司(开发公司)都会有代码审核和严格QA程序,一般的公司就很难说咯,在法律上目前还没有完全支持处罚程序员bug经济损失的判例(国内如此),国外也 ...

  4. linux 目录定义

    /     根目录,存放系统命令和用户数据等(如果下面挂载点没有单独的分区,它们都将在根目录的分区中) /boot     boot loader 的静态链接文件,存放与Linux启动相关的程序/ho ...

  5. C++引用详解

    引用的概念 引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符 &引用名=目标变量名: 如下:定义引用ra,它是变量a的引用,即别名. i ...

  6. myeclipse编译、输出

    在项目上点右键:run--run configuration, 选择左边的“compile GWT Application”,新建一个编译配置,然后选右下角的run.

  7. 1、SQL可搜索可排序可分页存储过程, 2、范围内的随机时间 适用于sql 2008以上

    -- ============================================= -- Author: 蜘蛛王 -- Create date: 2015-10-29 -- Descri ...

  8. if you end up with a boring miserable life

  9. C++程序设计(关于函数中数组传递的一点心得)

    题目: 10个学生考完期末考试评卷完成后,老师需要划出及格线,要求如下: (1) 及格线是10的倍数: (2) 保证至少有60%的学生及格: (3) 如果所有的学生都高于60分,则及格线为60分:   ...

  10. [2014.01.27]wfPng 水印贴图组件 2.1

    支持载入bmp,jpg,gif,png四种格式等. 支持图片水印使用png格式,支持区域透明,半透明的png图片. 支持图片缩放. 支持画线.画矩形.画椭圆,画正圆等图形. 支持在图片上输出文字. 能 ...