博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDBC插入数据超长时无法自动截断问题
阅读量:6274 次
发布时间:2019-06-22

本文共 3933 字,大约阅读时间需要 13 分钟。

问题

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

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

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

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

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

  但是到了JDBC就是SQLException了。

解决

  JDBC Driver作为MySQL Client与MySQL Server交互时,JDBC Driver默认会设置会话SQL_MODEL='STRICT_TRANS_TABLES',可以写一个sql语句:'select @@session.sql_mode;',executeQuery执行以下(详见最后源码),默认情况下JDBC的jdbcCompliantTruncation(是否截断)参数为true,修改为false即可解决。(MySQL本身也可以设置相关的配置,详见)

  将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 ";

  效率过低,忽略。

源码

1 package test.jdbc; 2  3 import java.sql.*; 4  5 /** 6  * Created by zhengbin06 on 16/9/14. 7  */ 8 public class DataBaseTest { 9     public static Connection getConnection() throws SQLException,10             java.lang.ClassNotFoundException {11         Class.forName("com.mysql.jdbc.Driver");12         String url = "jdbc:mysql://localhost:3306/poi_test?jdbcCompliantTruncation=true";13 //        String url = "jdbc:mysql://localhost:3306/poi_test?jdbcCompliantTruncation=false";14         String username = "root";15         String password = "";16         Connection con = DriverManager.getConnection(url, username, password);17         return con;18     }19     20     public static void main(String args[]) {21         try {22             Connection con = getConnection();23             Statement sql_statement = con.createStatement();24             25 //            String query = "select * from wm_poi_dispatch_setting";26             String query = "select @@session.sql_mode;";27 //            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)) " +28 //                    "where wm_poi_id = 1";29 //            sql_statement.executeUpdate(update);30             ResultSet result = sql_statement.executeQuery(query);31             32 //            System.out.println("Student表中的数据如下:");33 //            System.out.println("------------------------");34 //            System.out.println("wm_poi_id" + " " + "logistics_id" + " " + "value" + " " + "diff");35 //            System.out.println("------------------------");36             37 //            while (result.next()) {38 //                int wm_poi_id = result.getInt("wm_poi_id");39 //                int logistics_id = result.getInt("logistics_id");40 //                int value = result.getInt("value");41 //                String diff = result.getString("diff");42 //                System.out.println(" " + wm_poi_id + " " + logistics_id + " " + value + " " + diff);43 //            }44             System.out.println("|@@session.sql_mode|");45             while(result.next()) {46                 String sql_mode = result.getString("@@session.sql_mode");47                 System.out.println(sql_mode);48             }49             sql_statement.close();50             con.close();51         } catch (java.lang.ClassNotFoundException e) {52             System.err.print("ClassNotFoundException");53             System.err.println(e.getMessage());54         } catch (SQLException ex) {55             System.err.println("SQLException: " + ex.getMessage());56         }57     }58 }
View Code

转载地址:http://jjgpa.baihongyu.com/

你可能感兴趣的文章
PHP版微信权限验证配置,音频文件下载,FFmpeg转码,上传OSS和删除转存服务器本地文件...
查看>>
教程前言 - 回归宣言
查看>>
PHP 7.1是否支持操作符重载?
查看>>
Vue.js 中v-for和v-if一起使用,来判断select中的option为选中项
查看>>
Java中AES加密解密以及签名校验
查看>>
定义内部类 继承 AsyncTask 来实现异步网络请求
查看>>
VC中怎么读取.txt文件
查看>>
如何清理mac系统垃圾
查看>>
企业中最佳虚拟机软件应用程序—Parallels Deskto
查看>>
送给“正在纠结”、“准备纠结”的前端开发们
查看>>
Nginx配置文件详细说明
查看>>
怎么用Navicat Premium图标编辑器创建表
查看>>
谈DELL收购EMC
查看>>
Spring配置文件(2)配置方式
查看>>
MariaDB/Mysql 批量插入 批量更新
查看>>
ItelliJ IDEA开发工具使用—创建一个web项目
查看>>
學習 React.js:用 Node 和 React.js 創建一個實時的 Twitter 流
查看>>
solr-4.10.4部署到tomcat6
查看>>
切片键(Shard Keys)
查看>>
淘宝API-类目
查看>>