异常信息

exception.ServiceException: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'XXX' at row 1

问题

代码运行发现有一行报警,很明显可以判断字段插入内容超过表结构设置的长度了。不过比较奇怪的是,为什么测试环境一直没测试出来呢,难道是测试和线上环境Mysql配置不同?咨询了dba,得到的反馈是一致的。

分析

首先可以确定的是测试环境和线上表单是一致的,因此排除字段长度不一致的原因。

然后怀疑是否是测试环境有什么配置导致插入时会自动截断?

1、捷径,先搜索关键字“mysql设置插入超长自动截断”

发现mysql的sql_mode:

mysql支持的sql_mode模式:ANSI、TRADITIONAL、STRICT_ALL_TABLES和STRICT_TRANS_TABLES。

ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。

TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。

STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。只对支持事务的表有效。

STRICT_ALL_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。对所有表都有效。

测试了命令行插入超长字段内容,确实是有warning,但是插入成功了。也就是说我所执行的命令行默认是ANSI模式的,所以只报了warning

难道是代码运行时jdbc设置了严格模式?

2、查源码

首先根据错误位置

找到对应位置

看下xopen哪来的

public final static int ER_DATA_TOO_LONG = 1406; //SQLSTATE: 22001 Message: Data too long for column '%s' at row %ld

...public static final String SQL_STATE_STRING_DATA_RIGHT_TRUNCATION = "22001";

...

mysqlToSqlState.put(MysqlErrorNumbers.ER_DATA_TOO_LONG, SQL_STATE_STRING_DATA_RIGHT_TRUNCATION);

具体源码不展开,基本可以看到先从mysql返回了一个1406的ERROR SQLSTATE,然后转译成了22,进行错误判断,后抛出MysqlDataTruncation异常。

注意到,这里是ERROR,也就是说jdbc的sql_mode应该是严格模式,搜索下,发现以下代码:

private void setupServerForTruncationChecks() throwsSQLException {if(getJdbcCompliantTruncation()) {if (versionMeetsMinimum(5, 0, 2)) {

String currentSqlMode= this.serverVariables.get("sql_mode");boolean strictTransTablesIsSet = StringUtils.indexOfIgnoreCase(currentSqlMode, "STRICT_TRANS_TABLES") != -1;if (currentSqlMode == null || currentSqlMode.length() == 0 || !strictTransTablesIsSet) {

StringBuffer commandBuf= new StringBuffer("SET sql_mode='");if (currentSqlMode != null && currentSqlMode.length() > 0) {

commandBuf.append(currentSqlMode);

commandBuf.append(",");

}

commandBuf.append("STRICT_TRANS_TABLES'");

execSQL(null, commandBuf.toString(), -1, null, DEFAULT_RESULT_SET_TYPE, DEFAULT_RESULT_SET_CONCURRENCY, false, this.database, null, false);

setJdbcCompliantTruncation(false); //server's handling this for us now

} else if(strictTransTablesIsSet) {//We didn't set it, but someone did, so we piggy back on it

setJdbcCompliantTruncation(false); //server's handling this for us now

}

}

}

}

可以看到,默认设置了严格模式,终于破案了。

这个问题遇到后,事先知道有这么一个坑,以后如果遇到命令行可以执行,而jdbc执行报错的问题,就可以道出原因了。另外命令行也可以设置sql_mode,这样二者就一致了。

set sql_mode='STRICT_TRANS_TABLES';

验证结果:

mysql 超长字段_Mysql命令行插入字段超长不报错,而jdbc报错问题分析相关推荐

  1. 英文版mysql导入导出_mysql命令行导出,导入数据库

    一.MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:\Program Files\MySQL\MySQL Se ...

  2. mysql影子拷贝_Mysql命令行导入sql

    phpmyadmin 导出 utf-8 的 insert 模式的 abc.sql ftp abc.sql 到服务器 ssh 到服务器 mysql -u abc -p use KKK(数据库名,如果没有 ...

  3. mysql 删除字段_MySQL命令行删除表中的一个字段

    先看看删除之前的表结构: mysql> select * from test; +------+--------+----------------------------------+----- ...

  4. mysql添加表字段_mysql命令添加表字段

    常用的通过mysql命令来更改表结构的一些sql语句,包括添加.删除.修改字段.调整字段顺序. 添加字段: alter table `user_movement_log` Add column Gat ...

  5. mysql执行系统命令_mysql 命令行执行 sql

    1.直接输入sql执行 MySQL> select now(); +---------------------+ | now() | +---------------------+ | 2013 ...

  6. 命令行mysql数据库备份_MySQL命令行备份数据库

    For instance : 数据库地址:127.0.0.1 数据库用户名:root 数据库密码:psd 数据库名称:samego samego_2 samego数据库下的两张表 managers_1 ...

  7. mysql select乱码_MySQL命令行查询乱码解决方法:

    MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例如还停留在latin1 2.table的语系设定问题(包含character与collation) 3.客户端程式(例如 ...

  8. mysql如何使用命令行操作_MySQL命令行基本操作

    本文记录的是windows7系统下Mysql的命令行基本操作. 一.MySQL启动与登录 1. MySQL启动: 通过运行mysql安装目录下的/bin/mysqld.exe文件来启动Mysql服务. ...

  9. Mysql语法大全(命令行)(简洁、明了、全面)

    Mysql命令行的语法 另外一个Mysql语法大全的版本:点这里 两个Mysql语法大全以及命令行代码!!!基本上学习Mysql没有问题 嘿嘿!学习是一个长期的过程!!!还会继续更新!!! 基本的My ...

最新文章

  1. java接口匿名内部类_JAVA技术分享:接口,内部类,匿名内部类
  2. 10分钟出一个块的BCH,可以作为日常支付?
  3. 计算机组成原理 — CPU 中央处理器
  4. 自主定义适合自己的Keil主题
  5. [Math][Algebra]--线性代数中的各种空间
  6. 深度学习中softmax交叉熵损失函数的理解
  7. sklearn分类器性能评估
  8. Thinkpad SL400安装黑苹果10.8.4全纪录
  9. C++---模板特化
  10. 09_$.ajax()参数详解及标准写法
  11. java request含嵌套_使用 RxJava 进行嵌套串行网络请求的一种方法
  12. python读取海康威视摄像头价格_OpenCV+海康威视摄像头的实时读取
  13. java毕业设计都市书城系统Mybatis+系统+数据库+调试部署
  14. GSM模块通过服务器或GSM内部获取网络时间 网络授时
  15. 如何用手机连接无线网络
  16. IEEE Access投稿流程经验分享
  17. python3GUI--微博图片爬取工具V1.5(附源码)
  18. [转载]【苹果千层派】轻松玩转酥皮_万金油_新浪博客
  19. ebay注册流程_2018eBay注册开店流程?
  20. 人力资源年终数据分析报告怎么写?这份攻略拿走不谢

热门文章

  1. xp系统禁用了usb服务器,windowsXP系统下如何禁止电脑使用usb设备
  2. 关于java时区转换夏令时问题及解决办法
  3. 【网友评出的得分最高的100部电影】你有多少部没看过?留着找时间看咯!!
  4. 计算机控制系统稳定性分析实验报告,自动控制实验报告一-控制系统的稳定性分析...
  5. java 分转换元_java 金钱元和分互相转换
  6. 你是一流的输家,你因此成为一流的赢家
  7. 常用系统优化软件下载
  8. 计算机辅助园林设计作业,《计算机辅助园林设计B - usleducn.DOC
  9. 小狗拉菲扫地机器人_扫地机器人和吸尘器到底该怎么选?
  10. golang websocket绑定用户_Golang(五)最佳Web框架对比