ORA-12899_插入的数据长度超过实际长度

9 篇文章 0 订阅
3 篇文章 0 订阅

1 排查过程

1.1 出错场景

将任务执行异常结果插入异常表时,column_a的实际长度4000小于实际长度5005,报错

1.2 解决思路

解决方案分为两种:1,修改数据库的字段长度;2,把数据截取至字段上线后,插入

首先,跟业务确认,得知,该异常字段可只截取异常信息的一部分进行保存即可,所以我决定在代码中将异常信息截取,后执行插入操作。

接着,通过调试,发现同事有做这方面的处理,代码如下,猛一看没问题,实则不然。因为:Java中String的长度与Oracle的varchar2的长度的单位不同:(这个在后边会讲)

// 修改前
if(columnA.length() > 4000){
    columnA = columnA.substring(0, 3500);
}

2 知识点

2.1 Java中string的长度和Oracle中varchar2的长度的单位

  • String的长度表示字符个数
  • varchar2的长度表示的是字节的个数
  • Oracle的字符集不同,一个字符占的字节数也不一样

2.2 两个常见的Oracle字符集(其实是我接触过的0_0)

  • ZHS16GBK:一个中文字符占两个字节
  • AL32UTF8:一个中文字符占三个字节

3 解决思路

  1. 获得当前数据库的字符集
  2. 根据字符集来判断string的字符上限,并做截取

3.1 查询当前数据库的字符集SQL

select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET';
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值