很怪异的 “将截断字符串或二进制数据” 问题

inthirties
锦翰科技总经理
博客专家认证
2010-01-27 11:02:03
将截断字符串或二进制数据是个很常见的问题,可是我这里遇到的是个让人琢磨不明白的问题

首先看看报错的代码
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1454)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:388)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:338)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:185)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:160)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:320)
at sun.reflect.GeneratedMethodAccessor12.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:45)
at $Proxy1.execute(Unknown Source)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:22)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:51)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:29)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:65)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:39)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:93)
... 7 more

是用ibatis3做持久层的。
JDBC的driver使用的sqljdbc4.jar

SQLServer有两台一样的库
以SQLA, SQLB带称
版本均为
Microsoft SQL Server 2005 - 9.00.4035.00 (X64)
Nov 24 2008 16:17:31
Copyright (c) 1988-2005 Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)

客户端的程序在两个相同的linux进行运行
Linux平台
uname -a
Linux localhost.localdomain 2.6.18-92.el5 #1 SMP Tue Jun 10 18:51:06 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
现在用LinuxA,LinuxB代称

一条很普通的insert语句,出现以上问题

而且更怪异的是。LinuxA,分别在SQLA,SQLB都可以成功,不出错,但是LinuxB不行,Linux同样的java代码,在SQLA上可以成功,但是在SQLB上出上面的错。


希望高人帮助解答。

如果分不够,在开新贴给分。
...全文
1746 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
rjxianson 2012-05-24
  • 打赏
  • 举报
回复
怎么解决呢?
rjxianson 2012-05-24
  • 打赏
  • 举报
回复
不明白

已经解决了,原来是有个insert的trigger,这个trigger有一定的逻辑,需要记录hostname

而出问题的那个Linux的hostname很长,而其中SQLA上没有trigger,SQLB上入库才只在LinuxB上出问题。

是怎么回事!?
antwingfox 2011-11-02
  • 打赏
  • 举报
回复
也出现类似问题,不过……来看看解答……
buyaochengnuo 2010-09-16
  • 打赏
  • 举报
回复
原来是这么回事,哦,长知识了,谢谢啦
inthirties 2010-01-27
  • 打赏
  • 举报
回复
sql是用的绑定变量的方式执行的。

把出错的数据,转换成sql的方式,在sqlbrowser里执行是OK的,

而且上面的错误仅仅出现在LInuxB 到 SQLB上出错,而LinuxB 到 SQLA执行同样的代码,没有问题。

而且和LinuxB一样的机器LinuxA上执行同样的代码,到SQLA和SQLB,都可以成功。

SQL77 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 inthirties 的回复:]
引用 4 楼 fredrickhu 的回复:
用事件探查器跟踪下错误信息


谢谢,可以简单的讲一下步骤么,实在是比较着急,对sqlserver又不了解。
[/Quote]
事件探测一下插入语句,看一下语句里面哪些可能会超过
SQL77 2010-01-27
  • 打赏
  • 举报
回复
一条很普通的insert语句,出现以上问题


检查字段类型和长度吧,主要是你的值
inthirties 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fredrickhu 的回复:]
用事件探查器跟踪下错误信息
[/Quote]

谢谢,可以简单的讲一下步骤么,实在是比较着急,对sqlserver又不了解。
inthirties 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chuifengde 的回复:]
查找出错的sql语句,找出本条语句中所有字段对应的值,与数据库字段长度对照
[/Quote]

看上面的信息,都是一样的语句,而且值都没有问题。
--小F-- 2010-01-27
  • 打赏
  • 举报
回复
用事件探查器跟踪下错误信息
chuifengde 2010-01-27
  • 打赏
  • 举报
回复
查找出错的sql语句,找出本条语句中所有字段对应的值,与数据库字段长度对照
inthirties 2010-01-27
  • 打赏
  • 举报
回复
谢谢,这么快回复

也这样试过,检查所有数据,没有超过范围的。

而且注意后面的现象,同样的代码,同样的数据库,为何LinuxA都可以成功,而LinuxB仅在其中一台SQLServer中遭遇错误。

andysun88 2010-01-27
  • 打赏
  • 举报
回复
设置的字段的长度小了。
inthirties 2010-01-27
  • 打赏
  • 举报
回复
已经解决了,原来是有个insert的trigger,这个trigger有一定的逻辑,需要记录hostname

而出问题的那个Linux的hostname很长,而其中SQLA上没有trigger,SQLB上入库才只在LinuxB上出问题。

感觉SQL Server也比较好玩,不过管理和性能方面和Oracle还是有点差异的。

来者都有分,谢谢大家的回答了
clarkchiang 2010-01-27
  • 打赏
  • 举报
回复
把字段长度放长

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧