Java 当数据没有问题时,字符串或二进制数据将被截断

Java 当数据没有问题时,字符串或二进制数据将被截断,java,sql,sql-server,daemon,Java,Sql,Sql Server,Daemon,我在一个正在工作的pop3守护进程上遇到了一个错误,该守护进程应该从服务器提取电子邮件数据并将其插入多个本地数据库表中。但我似乎每秒都会在日志中看到这个问题,我认为这会对数据库性能和使用大量数据库池产生负面影响 看到此消息后,我检查了列数据的长度,并实现了一个代码,如果数据超过指定长度,则该代码将限制数据访问DB。但即使在这之后,错误仍然会发生。奇怪的是,在数据库中单独执行此查询会插入数据。但是运行它会引起问题。SQL Server 2015。该表没有触发器 [SQL错误]错误代码:8152,

我在一个正在工作的pop3守护进程上遇到了一个错误,该守护进程应该从服务器提取电子邮件数据并将其插入多个本地数据库表中。但我似乎每秒都会在日志中看到这个问题,我认为这会对数据库性能和使用大量数据库池产生负面影响

看到此消息后,我检查了列数据的长度,并实现了一个代码,如果数据超过指定长度,则该代码将限制数据访问DB。但即使在这之后,错误仍然会发生。奇怪的是,在数据库中单独执行此查询会插入数据。但是运行它会引起问题。SQL Server 2015。该表没有触发器

[SQL错误]错误代码:8152,sqlState:22001,消息:字符串或二进制数据将被截断

//查看问题后实现的代码

for (int i = 0; i < list1.size(); i++) {
MailRcvInfoVO infoVO = (MailRcvInfoVO)list1.get(i);         
  if (infoVO.getRcvId().getBytes("UTF-8").length > 200) {
    rcvToIdLength = infoVO.getRcvId().getBytes("UTF-8").length;
    isValidMail = false;
    break;
  }

  if (infoVO.getRcvName().getBytes("UTF-8").length > 200) {
    rcvToNameLength = infoVO.getRcvName().getBytes("UTF-8").length;
    isValidMail = false;
    break;
  }
}
for(int i=0;i200){
rcvToIdLength=infoVO.getRcvId().getBytes(“UTF-8”).length;
isValidMail=false;
打破
}
if(infoVO.getRcvName().getBytes(“UTF-8”).length>200){
rcvToNameLength=infoVO.getRcvName().getBytes(“UTF-8”).length;
isValidMail=false;
打破
}
}

您可以使用sql事件探查器检查正在执行的查询。Thx但上面发布的t_mail_rcvinfo查询是导致错误的查询。所有类似类型的插入都会导致错误。您的问题是
rcvInfoId
字段。什么是
rcvInfoId
文件类型@TurtleSKrcvInfoid和mailid只是生成的唯一UUID,用作主键。我不认为这是问题所在,因为这些生成的uuid用于所有其他表。您是否看过Brent Ozar关于打开跟踪标志460的建议。它提供了有关违规列/值的更多信息。Brent的博客文章可在以下位置获得:
for (int i = 0; i < list1.size(); i++) {
MailRcvInfoVO infoVO = (MailRcvInfoVO)list1.get(i);         
  if (infoVO.getRcvId().getBytes("UTF-8").length > 200) {
    rcvToIdLength = infoVO.getRcvId().getBytes("UTF-8").length;
    isValidMail = false;
    break;
  }

  if (infoVO.getRcvName().getBytes("UTF-8").length > 200) {
    rcvToNameLength = infoVO.getRcvName().getBytes("UTF-8").length;
    isValidMail = false;
    break;
  }
}