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\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。

问题二:

有西班牙语特殊字符的查询结果在不同服务器上查询结果显示不同,本地执行有乱码,QA服务器正常。

这个问题也纠结了挺久,在各种尝试无果后想到了一个控制面板的配置项:在"Region and Language"配置项的管理员选项卡中有一个"Language for non-Unicode programs"选项。之前为了运行某些没有使用Unicode编码的国产软件时将这个配置项改为了中文,我的系统本来是英文版的。于是将这个选项改回英文,问题解决。

因此,这个问题可以重新描述:使用Oracle Provider for OLE DB查询含有非Unicode编码字段内容时,若系统的非Unicode语言选项不正确,会导致查询结果编码不正确的问题。

时间: 2024-12-14 18:02:51

Oracle诡异结果调查备忘 - A investigation memo of weird Oracle database search results的相关文章

Oracle数据库手动恢复备忘日志

最近因为升级了Mac os x 10.10 Yosemite,突然前几天的一个晚上,开机发现就停留在开机界面了,看来BETA果然是不靠谱,然后想到自己这不前几天刚备份完吗,没事,TimeMachine是何等神器,二话不说直接恢复.但是恢复完,我后悔了,一来是忘了昨天晚上还加班呢,加班的成功保留成果所剩无几,关键我这才发现TimeMachine既然不备份虚拟机文件(虚拟机文件30G,估计直接给略过了吧),难怪每次都觉得备份那么快. 不过后悔也没用,重新搭开发环境吧.操作系统WIN7->开发工具VS

Oracle用法、函数备忘记录

Listagg select * from emp select LISTAGG(ename,'-') within group (order by deptno desc) from emp; 可以看到功能类似wm_concat,可以自定义连接符,区别: LISTAGG? : 11g2才提供的函数,不支持distinct,拼接长度不能大于4000,函数返回为varchar2类型,最大长度为4000. 和wm_concat相比,listagg可以执行排序.例如select deptno, lis

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

项目中oracle存储过程记录--常用语法备忘 项目中需要写一个oracle存储过程,需求是收集一个复杂查询的内容(涉及到多张表),然后把符合条件的记录插入到目标表中.其中原表之一的日期字段是timestamp类型,目标表的字段是varchar2类型: 其中一些内容很常用,所以做下记录,供查找. 1.存储过程的格式 oracle存储过程和函数都可以实现,一般没有返回值,则采用存储过程,函数比sqlserver的功能强大.oracle变量定义最好加上前缀如V_,查询条件中变量名称和字段名称不能重复

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

linux shell下  svnserve - d -r + 目录   例如:svnserve -d -r /svn 启动 svn服务. 访问svn://192.168.0.120/kjcg 测试. 启动oracle: 一.如何启动数据库实例 1.进入到sqlplus启动实例 [[email protected] ~]$ su - oracle --“切换到oracle用户” 2. Password: [[email protected] ~]$ lsnrctl start  --“打开监听”

Oracle使用备忘

初学Oracle,很多语句记不住,写在这里备忘. 1.查看某表空间的数据文件 select file_name 文件名, tablespace_name 表空间名, bytes/1024/1024 已使用大小M, maxbytes/1024/1024/1024 总大小M from dba_data_files where tablespace_name = 'ABCTBL'; 其中‘ABCTBL’为你要查询的表空间的名称. 2.为某表空间增加数据文件 ALTER TABLESPACE ABCTB

SQL注入备忘单

Find and exploit SQL Injections with free Netsparker SQL Injection Scanner SQL Injection Cheat Sheet, Document Version 1.4 About SQL Injection Cheat Sheet Currently only for MySQL and Microsoft SQL Server, some ORACLE and some PostgreSQL. Most of sam

备忘:hibernate, logback, slf4j实际应用一例

用hibernate写一些简单的数据库的Java应用.主要是温习一下.之前弄过的一些都忘了.发现还是得记下来,不然很快就忘. 1. Eclipse版本,用Juno, J2EE版本.最好下载zip版本的,直接解压就运行. 2. JDK安装,到Oracle上搜索jdk, 然后下载.安装JDK后,设置JAVA_HOME,指到JDK安装目录,将%JAVA_HOME%\bin放到PATH变量的最前面. 3. Maven.到Eclipse marketplace上搜索maven, 会有一个Maven Int

Linux XAMPP FAQ 留在这里做备忘

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

JVM内存知识备忘

又是一篇备忘... 主要记录一些知识,进行一些资源的汇总. 先来群里liufor大大提供的两张图,清晰易懂: Dockerized Java https://www.youtube.com/watch?v=NQ5hTEp-GTM Java on Linux for devs and ops https://www.slideshare.net/aragozin/java-on-linux-for-devs-and-ops 常用配置&命令 常用命令 JVM启动用的命令行 jcmd process_