应用程序在获取数据时,接口返回报错:“转换列溢出整数数据类型”;此应用已在多地使用较长时间,从未出现过此问题,故怀疑为数据库接口处理异常。报错信息如下:
通过报错内容,猜测报错原因为应用获取数据时数据转换类型后溢出导致,于是和现场沟通打开了OCI_TRACE日志(即在dm_svc.conf中添加配置OCI_TRACE=(1),配置后需要重启应用生效),配置后让应用复现问题操作,查看生成的TRACE日志文件确认应用在获取列para_7时的绑定情况如下:
可以看出应用在获取此列时是按SQLT_INT进行获取的,且缓冲区长度定义为4,则应用端可存放数据范围为: -231-231-1,即-2147483648-2147483647;于是我们查询了表中此列数据,确认此列最大值已远远超过此限值。
此问题是因为此列在数据库中类型为numeric(10,0),应用程序在获取列类型后因为number类型获取较为复杂,做了类型转换,通过SQLT_INT去获取结果值,故造成了获取时转换溢出的问题。
通过此问题想到了几个常见的类似问题,合并记录到此处:
应用报错数据被截断一般为绑定参数类型单个值大小小于数据实际值长度,导致获取数据不完整进行报错。例测试表中C1列存放数据为:
可以看出此时表中存放数据为10个字节,如果此时应用端通过绑定9个字节长度内存去获取数据:
则此时获取数据时会出现报错:
此问题在表中存放中文时还需注意字符编码,如数据库编码为GB18030,客户端编码为UTF-8,则也可能出现“数据被截断”的问题,此时我们可以在dm_svc.conf中添加CHAR_CODE=(PG_GB18030)配置或修改应用端字符编码解决。
对于查询绑定长度不足时报错多为截断,当为插入操作时如果我们插入的数据长度大于表定义长度,则此时会出现报错“目标缓存长度不足”,例表C1列定义为varchar(10),我们进行绑定插入11个字符数据:
可以看出此时则会报错缓存长度不足
文章
阅读量
获赞