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

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上出上面的错。


希望高人帮助解答。

如果分不够,在开新贴给分。
...全文
1741 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
  • 打赏
  • 举报
回复
把字段长度放长
本课程目前总计105课时,并且不定期的进行新知识点的补充,目的是打造一部围绕MySQL的全体系课程。课程涵盖11大章节,分别是:第1章基础&技巧:这部分的重点是会讲解一些容易被开发人员忽略的技巧,例如utf8mb4字符集问题、如何使用外部临时表提高查询效率、快速创建同结构表及快速复制数据截断表和删除数据使用和差异、以及怎样使用help语句查看帮助文档。第2章六大数据类型:这部分的重点是对MySQL的8种数字类型、5种日期和时间类型、10种字符串类型、枚举类型、集合类型和时间戳类型的区别和使用进行深入讲解。第3章数据库函数大全:MySQL中有上百种函数之多,使用函数可以快速的解决我们很多开发问题,但是由于我们掌握的函数不够多,往往没有办法实际应用,本章节重点是让你掌握更多好用而你不知道的函数使用。第4章数据库引擎精讲:本章节带您深入到MySQL的体系架构,深入理解innoDB、MyISAM、MEMORY、ARCHIVE引擎的区别和使用原则。第5章数据库索引精讲:索引是保障我们查询效率的重点,本章节从逻辑存储和物理存储的底层入手,深入剖析索引的存储结构和查找方法,掌握聚簇索引、非聚簇索引、前缀索引等的存取原理和使用技巧。第6章调优工具:工欲善其事必先利其器,本章节带你掌握读写比例查询、缓存设置、执行计划和Profile调优工具。第7章参数调优和索引调优:怎么样让SQL执行的更快、数据库的性能更强,怎样充分利用索引进行不断的优化。本章节会为您讲解16种MySQL的优化策略。第8章SQL调优:SQL语句是我们日常使用的重点,怎么样写出一手高性能的SQL语句,其实是具有一定技巧的,本章节讲解8种优化策略,让数据SQL执行性能更强。第9章分库分表:在面对海量数据的时候单表和单个数据库的性能始终会存在瓶颈,本章节为您讲解分库分表的原理和技巧,怎么样使用Merge引擎分表、深入掌握MySQL数据库分区表的能力。第10章高可用架构和安全管理:本部分涵盖MySQL的高可用架构,主备架构、主从架构、主从从架构、互为主从架构。数据的同步复制、半同步复制、异步复制。主从复制原理和主从延迟的问题,以及在管理和开发层面怎样保证数据库安全。第11章MySQL日志:对MySQL的7种日志进行讲解,包括errorlog错误日志、general log查询日志、slow log慢日志、binlog 二进制日志、redlog重做日志。课程会附带配套文档和SQL脚本。有问题可以直接联系作者,24小时线上答疑。

22,207

社区成员

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

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