MySql超长自动截断实例分析

分类:编程技术 时间:2024-02-20 15:27 浏览:0 评论:0
0
本文主要介绍MySql超长自动截断的实例分析,具有一定的参考价值。有兴趣的朋友可以参考一下。希望您读完这篇文章后能有所收获。让小编带你来了解一下吧。 。

如下

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` 日期时间 DEFAULT NULL、`CREATE_DATE` 日期时间 DEFAULT NULL、`UPDATE_USE R_ID` varchar( 13) DEFAULT NULL, `STATION_TYPE` int(1) unsigned Zerofill DEFAULT NULLCOMMENT '令牌类型(试用版本: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('12121312312312ahahahah aassasdasd') ;select * from p_app_station where wx_app_id like '12121312312312%';

显然 varchar(20) 不足以容纳 121213123123 12 阿萨斯达斯德

查询结果如下

确实是自动截断的,但是在项目中执行同一条SQL时,发现并不是这样的这种情况下,会报告错误。

第 %ld 行的列 '%s' 的数据被截断

考虑到它是同一个数据库并且没有不同的架构,这种可能性应该出现在jdbcDriver上。

查看jdbc源代码

private void setupServerForTruncationChecks() throws SQLException {  if (getJdbcCompliant截断()) { if (versionMeetsMinimum(5, 0, 2)) { String currentSqlMode = this.serverVariables.get("sql_mode"); } boolean strictTransTablesIsSet = StringUtils.indexOfIgnoreCase(currentS qlMode, "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(假); // 服务器现在为我们处理这个 } else if (strictTransTablesIsSet) { // 我们没有设置它,但有人设置了,所以我们利用 itsetJdbcCompliantTruncation(false); // 服务器现在为我们处理这个 } } } }}

查看 getJdbcCompliantTruncation 方法,其默认值ue 是

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。

感谢您仔细阅读本文。希望小编分享的这篇文章《MySql超长自动截断实例分析》对大家有所帮助。也希望大家多读书。支持,关注行业资讯频道,更相关知识等你来学习!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > MySql超长自动截断实例分析

用户评论