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] - ...
随机推荐
- Validform使用ajax详解
demo.config({ showAllError:true, url:"这里指定提交地址", ajaxpost:{ //可以传入$.ajax() ...
- 王爽< 汇编语言>实验十二
;此乃安装程序 ;功能:将8086cpu中断类型码为0 的中断向量设置为我们编写的中断服务程序入口地址 ;该中断在除法发送溢出的时候产生 assume cs:code code segment mai ...
- RET2LIBC 练习(3) -- VIRTUALALLOC
国庆假期没事做了几道pwn题练手,等有时间在贴出pwn题的分析. 利用VIRTUALALLOC的方法绕过DEP其实和之前的方法大同小异了,只是VIRTUALALLOC开辟了一段新的可执行的内存空间,然 ...
- javascript中bind函数的作用
javascript的bind的作用 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- qsort函数、sort函数【转】
http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/ 先说明一下:qsort和sort,只能对连续内存的数据进行排序,像链 ...
- JMeter基础之一 一个简单的性能测试
JMeter基础之一 一个简单的性能测试 上一节中,我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测 ...
- Java BigDecimal 加减乘除运算
加法:add 减法:subtract 乘法:multiply 除法:divide BigDecimal bignum1 = new BigDecimal("10"); BigDec ...
- Oracle定时计划快速使用
Oracle定时计划快速使用 前言: SQL Server中有相关的定时计划,可以直接打开sql server 的任务管理器进行配置,可以方便.快速实现定时执行相应任务.相应的Oracle也有对应的定 ...
- Base64加密工具-iBlogs
简易的Base64加密工具开发步骤 1.编写Java测试桩 import java.io.BufferedReader; import java.io.IOException; import java ...
- spring.net xml 命名空间
<objects xmlns="http://www.springframework.net" xmlns:xsi="http://www.w3.org ...