mysql 超长字段_Mysql命令行插入字段超长不报错,而jdbc报错问题分析
异常信息
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报错问题分析相关推荐
- 英文版mysql导入导出_mysql命令行导出,导入数据库
一.MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:\Program Files\MySQL\MySQL Se ...
- mysql影子拷贝_Mysql命令行导入sql
phpmyadmin 导出 utf-8 的 insert 模式的 abc.sql ftp abc.sql 到服务器 ssh 到服务器 mysql -u abc -p use KKK(数据库名,如果没有 ...
- mysql 删除字段_MySQL命令行删除表中的一个字段
先看看删除之前的表结构: mysql> select * from test; +------+--------+----------------------------------+----- ...
- mysql添加表字段_mysql命令添加表字段
常用的通过mysql命令来更改表结构的一些sql语句,包括添加.删除.修改字段.调整字段顺序. 添加字段: alter table `user_movement_log` Add column Gat ...
- mysql执行系统命令_mysql 命令行执行 sql
1.直接输入sql执行 MySQL> select now(); +---------------------+ | now() | +---------------------+ | 2013 ...
- 命令行mysql数据库备份_MySQL命令行备份数据库
For instance : 数据库地址:127.0.0.1 数据库用户名:root 数据库密码:psd 数据库名称:samego samego_2 samego数据库下的两张表 managers_1 ...
- mysql select乱码_MySQL命令行查询乱码解决方法:
MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例如还停留在latin1 2.table的语系设定问题(包含character与collation) 3.客户端程式(例如 ...
- mysql如何使用命令行操作_MySQL命令行基本操作
本文记录的是windows7系统下Mysql的命令行基本操作. 一.MySQL启动与登录 1. MySQL启动: 通过运行mysql安装目录下的/bin/mysqld.exe文件来启动Mysql服务. ...
- Mysql语法大全(命令行)(简洁、明了、全面)
Mysql命令行的语法 另外一个Mysql语法大全的版本:点这里 两个Mysql语法大全以及命令行代码!!!基本上学习Mysql没有问题 嘿嘿!学习是一个长期的过程!!!还会继续更新!!! 基本的My ...
最新文章
- java接口匿名内部类_JAVA技术分享:接口,内部类,匿名内部类
- 10分钟出一个块的BCH,可以作为日常支付?
- 计算机组成原理 — CPU 中央处理器
- 自主定义适合自己的Keil主题
- [Math][Algebra]--线性代数中的各种空间
- 深度学习中softmax交叉熵损失函数的理解
- sklearn分类器性能评估
- Thinkpad SL400安装黑苹果10.8.4全纪录
- C++---模板特化
- 09_$.ajax()参数详解及标准写法
- java request含嵌套_使用 RxJava 进行嵌套串行网络请求的一种方法
- python读取海康威视摄像头价格_OpenCV+海康威视摄像头的实时读取
- java毕业设计都市书城系统Mybatis+系统+数据库+调试部署
- GSM模块通过服务器或GSM内部获取网络时间 网络授时
- 如何用手机连接无线网络
- IEEE Access投稿流程经验分享
- python3GUI--微博图片爬取工具V1.5(附源码)
- [转载]【苹果千层派】轻松玩转酥皮_万金油_新浪博客
- ebay注册流程_2018eBay注册开店流程?
- 人力资源年终数据分析报告怎么写?这份攻略拿走不谢
热门文章
- xp系统禁用了usb服务器,windowsXP系统下如何禁止电脑使用usb设备
- 关于java时区转换夏令时问题及解决办法
- 【网友评出的得分最高的100部电影】你有多少部没看过?留着找时间看咯!!
- 计算机控制系统稳定性分析实验报告,自动控制实验报告一-控制系统的稳定性分析...
- java 分转换元_java 金钱元和分互相转换
- 你是一流的输家,你因此成为一流的赢家
- 常用系统优化软件下载
- 计算机辅助园林设计作业,《计算机辅助园林设计B - usleducn.DOC
- 小狗拉菲扫地机器人_扫地机器人和吸尘器到底该怎么选?
- golang websocket绑定用户_Golang(五)最佳Web框架对比