码迷,mamicode.com
首页 > 数据库 > 详细

JDBC插入数据超长时无法自动截断问题

时间:2016-09-19 19:16:27      阅读:385      评论:0      收藏:0      [点我收藏+]

标签:

问题

  JDBC操作MySQL数据库时,当进行插入或更新操作的数据长度超过表字段的声明最大长度时,会报出以下错误,导致不能正常插入:

SQLException: Data truncation: Data too long for column ‘diff‘ at row 2

  但是当直接在MySQL客户端操作时,发现确实可以的,只不过会自动对插入的数据进行截断处理:

技术分享

  ‘diff‘字段的长度为3,下面插入一个超长的数据‘1234‘:

技术分享

  可以成功插入,并对数据进行了截断处理,插入结果为‘123‘,不过MySQL发出了警告(warning)。

  但是到了JDBC就是SQLException了。

解决

  默认情况下JDBC的jdbcCompliantTruncation(是否截断)参数为true,修改为false即可解决。(MySQL本身也可以设置相关的配置,详见MySQL——SQL Mode详解

  将JDBC连接的URL改为:

jdbc:mysql://localhost:3306/table_name?jdbcCompliantTruncation=false

  不过这样会存在另外一个问题,尝试更新int类型的数据,如果插入数据超长(也就是超过可以装载的大小),将插入字段的最大值:

技术分享

  所以最好的解决办法还是在程序中做判断+截断吧!

也算一种解决方法

  问题的产生就是,JDBC并不能对超长的插入字段进行自动截断处理并顺利插入数据,所以如果在SQL中获得字段的声明长度,再用MySQL提供的left等截断函数,也能实现,不过需要子查询,效率可想而知。

  获得某库某表某字段的声明长度SQL:

技术分享

  再加上LEFT()函数:

String update = "update wm_poi_dispatch_setting set diff=LEFT(4567, 
    (select CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = wm_poi_dispatch_setting and table_schema = poi_test and column_name = diff limit 0,1)
    ) " +     "where wm_poi_id = 1
";

  效率过低,请忽略。

 

JDBC插入数据超长时无法自动截断问题

标签:

原文地址:http://www.cnblogs.com/zhengbin/p/5886042.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!