Oracle字符乱码、数据越界訪问典型Bug分析

前言:

作为乙方,在甲方客户那里验收阶段发现两个诡异Bug。

下面就问题来源、问题根因、解决方式、怎样避免做具体描写叙述。

一、Bug1:Oracle读写字符乱码。

1、问题来源

Oracle数据库监听http://blog.csdn.net/laoyang360/article/details/46524519 须要获取最新插入的中文类别字符。以判定分类。单步调试发现每次接收到的都是乱码。

2、问题根因

编码格式不一致导致。

3、解决方式

第一步:查看oracle自身的编码格式,能够通过命令select userenv(‘language‘) from dual;查看。

查看后得知。眼下多家公用的oracle採用SIMPLIFIED CHINESE_CHINA.ZHS16GBK编码格式。

第二步:查看后台程序使用的编码格式,后台程序通过OTL读取、写入orcle数据库。

採用了环境变量设置putenv(),写入的是

NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8,也就是UTF-8编码格式。

第三步:由于oracle编码格式已经固定,仅仅能改动后台程序写入环境变量的格式为IMPLIFIED CHINESE_CHINA.ZHS16GBK编码格式。

第四步:查看编译工具VS2010使用的编码格式。我们知道:VC6.0默认ANSI编码。而VS2010默认UNICODE编码。UNICODE编码和GBK编码格式不一致,须要进行转换。

第五步:查了非常久,终于通过转换接口utf82gbk()以及gbk2utf8()完毕格式转换。

也就是说:从数据库读出数据,须要调用gbk2utf8()进行格式转换才干在VS2010下正常显示。

相同的,向数据库写入数据,须要调用utf82gbk()接口进行转换,才干确保写入oracle不会显示乱码。

而且,前台程序统一为utf8编码,统一转化才干确保没有乱码。

至于Utf8和Unicode的关系(一句话,utf8是对unicode字符集进行编码的一种编码方式。)详见知乎讨论:

http://www.zhihu.com/question/23374078

4、怎样避免

1)最早设计的时候,定下数据库的编码格式,各个模块负责人依照统一格式进行处理。

2)编译器不同导致编码格式不同,须要大家统一接口进行转换。实现接口可參见例如以下:http://blog.csdn.net/p569354158/article/details/6567175

二、Bug2:溢出,数据越界。

1、问题来源

程序频繁运行500个任务后。页面不能显示返回数据。从界面显示的数据看,序号为67138,67139。63140的都不能显示。

可是小的序号69,70都能正常显示相应的返回数据。

2、问题根因

数据越界訪问。可能在程序的某个地方採取了2个字节unsigned short存储(最大范围:0-2的16次幂-1,即:0-65535)。

问题是怎样发现的:

第一步:通过数字67138等推測数据越界,原因:67138>65535。

而69。70小于65535的都显示正常。

第二步:数据库入库编号和程序日志编号一一对照。查看得知:oracle相应的数据库表最早入库序号为67138等大于65535的值,但在程序第二次返回插入的结果表里变成了1618的序号值,而该序号非pointId,而是taskId或者systemId,也就是初步断定发生了越界訪问。

第三步:研究为什么这个编号须要在数据库中唯一呢?和相关设计人员电话确认。由于后期的程序需求偏离了最早期的设计,此处在我看来全然不须要使用唯一值。

仅仅要保证每次任务下发唯一就可以。由于我们的程序中由taskId索引唯一任务号,pointId的节点号为二级索引。

程序使用查询表中也是。先一级索引后二级索引。

数据库中採用序列sequence进行唯一值递增判定,最大值设置的非常大999999999999999999999999999。且两个表的触发器Trigger都调用这个序列。也就说,程序的频繁任务下发任务中,频繁运行后,几周或者几个月非常easy就超过65535的序号值。

综上,基本判定程序中出现越界訪问导致显示异常。


3、解决方式

1)情况着急:採取简单规避方案:更新序列Sequence当前值。当前值已经查过67000。须要回归到1又一次開始。

但有个知识点是,在sqldevelop以及全部的查看工具下,该值都不能手动改动。

须要删除后重建。

用户必须具有ALTER ANY SEQUENCE 才干改动改动sequence,能够alter除start之外的全部sequence,假设想改动start值,必须drop sequence再re-create。

2)未来须要定位到哪里越界訪问的,把类型至少改为unsigned int存储。

4、怎样避免

定义序号类型的变量,要考虑它的源头,怎样产生的,最小值、最大值是多少。再确定定义哪种类型的变量。

总结:

1.两个Bug都不难,但都须要理清思路。避免走弯路。

第一个Bug梳理到改完耗时3.5h,第二个Bug耗时5h。

2.第二个Bug非常诡异,在我运行完500个任务就突然不显示返回数据。程序基本没有改动不论什么逻辑。想了非常久,排除了非传输设备的影响,非搜索程序的影响。终于定位和65535有关。

2015-12-13 pm13:55 思于家中床前

作者:铭毅天下

转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/50282569

假设感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

时间: 2024-10-05 23:50:11

Oracle字符乱码、数据越界訪问典型Bug分析的相关文章

Oracle字符乱码、数据越界访问典型Bug分析

前言: 作为乙方,在甲方客户那里验收阶段发现两个诡异Bug.以下就问题来源.问题根因.解决方案.如何避免做详细描述. 一.Bug1:Oracle读写字符乱码. 1.问题来源 Oracle数据库监听http://blog.csdn.net/laoyang360/article/details/46524519 需要获取最新插入的中文类别字符,以判定分类.单步调试发现每次接收到的都是乱码. 2.问题根因 编码格式不一致导致. 3.解决方案 第一步:查看oracle自身的编码格式,可以通过命令sele

嵌套SQL语句訪问DB2中SQLCA的调用技巧

在IBM的关系型数据库产品DB2中,使用SQL Communication Area(SQLCA)将程序中嵌套的SQL语句执行情况返回给程序. 在程序中有针对性地对SQLCA实施调用,可对程序中各类SQL语句的执行结果实施控制,从而避免程序的意外终止.同一时候,也能够提高执行效率,减小系统开销和处理时间.本文将对此作一简要介绍. SQLCA的结构 SQLCA的结构定义例如以下: struc sqlca {        unsigned char     sqlcaid[8]; long    

设计模式入门之訪问者模式Visitor

//訪问者模式定义:表示一个作用于某对象结构中的各个元素的操作.它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. //从定义上看,这个模式跟装饰模式的定义非常类似(动态地给一个对象加入一些额外的职责).可是装饰模式很多其它是在原有的基础上进行功能加强或者改动:而訪问者模式很多其它是为对象加入全新的功能.訪问者模式适合那些须要频繁为某些类加入新功能.新操作的项目. //模式结构: //Visitor:訪问者接口,为全部的訪问者对象声明一个visit方法,用来表示对对象结构加入的功能,

Android 訪问权限清单

Android权限设置 概述 权限 说明 訪问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES 读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOCATION 通过WiFi或移动基站的方式获取用户错略的经纬度信息.定位精度大概误差在30~1500米 获取精确位置 android.permission.ACCESS_FINE_LOCATION 通过GPS芯片接收卫星

《Java设计模式》之訪问者模式

訪问者模式是对象的行为模式.訪问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作须要改动的话,接受这个操作的数据结构则能够保持不变. 分派的概念 变量被声明时的类型叫做变量的静态类型(Static Type),有些人又把静态类型叫做明显类型(Apparent Type):而变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type).比方 [java] view plaincopyprint" class="About" href="

Windows server2008 搭建ASP接口訪问连接oracle数据库全过程记录

真的是太不easy了,曾经的时候在window server 2003上面搭建了一套asp+oracle的接口系统.就费了好大的劲儿,事实上那会迷迷瞪瞪的也不知道怎么的就弄好了,也懒得管了.OK,从昨天到今天打算把接口从測试环境部署到公网环境上去的时候就出现了各种各样的问题.这次一定得记录一下. 先来说一下这套接口系统的总体方案: 之所用选用asp是由于属于轻量级的接口系统,仅仅须要改动好了以后复制粘贴上去接口就马上生效.而不须要像java系的接口程序要用tomcat打包.上传.部署这种.那这个

并发问题:大数据量的訪问

今天突然关注到这个问题,从网上看了非常多,受益良多.记录下来,以后回想~ 之前在工作中就遇到过这样的情况.两个用户同一时候操作一条记录,A用户查询某条记录,B用户把这条记录删除,A用户将查询的某条记录的某些值保存到其它的表里.这个bug也是困扰了好久,由于A用户的这种方法特别复杂,运行的时间比較长,所以这个问题出现的概率还非常高的呢.后来的解决方法是,A用户在最后保存前,再查一下这条记录.是从代码逻辑方面解决的这个问题,确实好了非常多,但始终认为是治标不治本. 今天看完以后认为有更好的解决方法的

大数据量高并发訪问的数据库优化方法

????假设不能设计一个合理的数据库模型.不仅会添加client和server段程序的编程和维护的难度,并且将会影响系统实际运行的性能.所以,在一个系统開始实施之前,完备的数据库模型的设计是必须的. ????在一个系统分析.设计阶段.由于数据量较小.负荷较低.我们往往仅仅注意到功能的实现.而非常难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低.这时再来考虑提高系统性能则要花费很多其它的人力物力,而整个系统也不可避免的形成了一个打补丁project. ????所以在考

主动訪问用户数据的背后是品牌战略

前段时间,百度站长平台公布了一个消息,消息称广大的站长朋友非常easy忽略一些用户主动訪问的数据.事实上在笔者觉得.这是百度側面的反馈给广大站长朋友的一个信号,就是告诉广大站长朋友应该多注重品牌宣传.以便让用户知晓你的站点服务内容,这样能够添加用户的二次訪问量,培养忠有用户! 主动訪问数据或能左右站点的排名 百度官方举例说明假如两个站点在2013年的时候,A和B的站点数据相当,假如在2014年的时候,B站点的用户主动訪问数据份额为30%,而A站点的用户主动訪问的数据份额是10%,而A站点的绝对流