MySql超长⾃动截断实例详解
MySql超长⾃动截断实例详解
⼩伙伴问到⼀个问题,为啥在项⽬中调⽤插⼊或者更新语句时超长的字⽆法⾃动截断,⽽在navicat中直接执⾏是可以⾃动截断的?
如下
CREATE TABLE `p_app_station` (
`WX_APP_ID` varchar(20) NOT NULL,
`APP_SECRET` varchar(33) DEFAULT NULL,
`IS_BINDING` int(1) DEFAULT '0',
`ACCOUNT_ID` int(13) DEFAULT NULL,
`TOKEN` varchar(40) DEFAULT NULL,
`BIND_URL` varchar(200) DEFAULT NULL,
`WX_APP_NAME` varchar(50) DEFAULT NULL,
`WX_APP_SID` varchar(50) DEFAULT NULL,
`WX_NO` varchar(50) DEFAULT NULL,
`CREATE_USER_ID` varchar(13) DEFAULT NULL,
`UPDATE_DATE` datetime DEFAULT NULL,
`CREATE_DATE` datetime DEFAULT NULL,
`UPDATE_USER_ID` varchar(13) DEFAULT NULL,
`STATION_TYPE` int(1) unsigned zerofill DEFAULT NULL COMMENT '标记类型(试⽤版:0,会员版:1,定制版:2)',
`ACTIVE_DATE` datetime DEFAULT NULL COMMENT '使⽤时间截⽌',
`APP_MODULE_ID` varchar(60) DEFAULT NULL COMMENT '推送模版消息ID',
PRIMARY KEY (`WX_APP_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert into p_app_station(wx_app_id) values('12121312312312啊啊啊啊啊aassasdasd');
select * from p_app_station where wx_app_id like '12121312312312%';
很明显varchar(20) 不⾜以容纳12121312312312啊啊啊啊啊aassasdasd
查询结果如下
确实⾃动截断了,但是在项⽬中执⾏同样的sql发现并⾮如此,反⽽报错。
Data truncated for column '%s' at row %ld
考虑到是同⼀个数据库,不存在模式不同,那么可能性应该出现在jdbcDriver上。
查看jdbc源码
private void setupServerForTruncationChecks() throws SQLException {
if (getJdbcCompliantTruncation()) {
if (versionMeetsMinimum(5, 0, 2)) {
String currentSqlMode = ("sql_mode");
boolean strictTransTablesIsSet = StringUtils.indexOfIgnoreCase(currentSqlMode, "STRICT_TRANS_TABLES") != -1;
if (currentSqlMode == null || currentSqlMode.length() == 0 || !strictTransTablesIsSet) {
StringBuilder commandBuf = new StringBuilder("SET sql_mode='");
if (currentSqlMode != null && currentSqlMode.length() > 0) {
commandBuf.append(currentSqlMode);
commandBuf.append(",");
}
commandBuf.append("STRICT_TRANS_TABLES'");
execSQL(null, String(), -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
truncated valuesetJdbcCompliantTruncation(false); // server's handling this for us now
}
}
}
}
查看getJdbcCompliantTruncation⽅法,其默认值为
private BooleanConnectionProperty jdbcCompliantTruncation = new BooleanConnectionProperty("jdbc
CompliantTruncation", true,
因此从3.1.2版本在jdbcurl中如果没有设置jdbcCompliantTruncation那么默认将会执⾏不截断并且报错。
那么加上参数是否可以呢?
取舍⼀下:
如果截断当出现⽐超长可能会有精度丢失的风险。
因此建议还是在程序中检查。
⽬前正在做关于使⽤hibernate validate的相关。
以上就是关于MySQL 截断的讲解,⼤家如有疑问可以留⾔或者到本站社区交流讨论,共同进步,感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。