共计 2678 个字符,预计需要花费 7 分钟才能阅读完成。
这篇文章主要介绍了 MySql 超长自动截断的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。
如下
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 = this.serverVariables.get( 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, 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
}
}
}
}
查看 getJdbcCompliantTruncation 方法,其默认值为
private BooleanConnectionProperty jdbcCompliantTruncation = new BooleanConnectionProperty( jdbcCompliantTruncation , true,
Messages.getString(ConnectionProperties.jdbcCompliantTruncation), 3.1.2 , MISC_CATEGORY, Integer.MIN_VALUE);
因此从 3.1.2 版本在 jdbcurl 中如果没有设置 jdbcCompliantTruncation 那么默认将会执行不截断并且报错。
那么加上参数是否可以呢?
取舍一下:
如果截断当出现比超长可能会有精度丢失的风险。
因此建议还是在程序中检查。
目前正在做关于使用 hibernate validate 的相关。
感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“MySql 超长自动截断的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!
正文完