加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL数据库MySql超长自动截断实例详解

发布时间:2020-12-12 02:26:18 所属栏目:MySql教程 来源:网络整理
导读:《MYSQL数据库MySql超长自动截断实例详解》要点: 本文介绍了MYSQL数据库MySql超长自动截断实例详解,希望对您有用。如果有疑问,可以联系我们。 MYSQL实例 MySql超长自动截断实例详解 MYSQL实例 小伙伴问到一个问题,为啥在项目中调用插入或者更新语句时超长

《MYSQL数据库MySql超长自动截断实例详解》要点:
本文介绍了MYSQL数据库MySql超长自动截断实例详解,希望对您有用。如果有疑问,可以联系我们。

MYSQL实例MySql超长自动截断实例详解

MYSQL实例小伙伴问到一个问题,为啥在项目中调用插入或者更新语句时超长的字无法自动截断,而在navicat中直接执行是可以自动截断的?

MYSQL实例如下

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` 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
MYSQL实例
insert into p_app_station(wx_app_id) values('12121312312312啊啊啊啊啊aassasdasd');
select * from p_app_station where wx_app_id like '12121312312312%';

MYSQL实例很明显varchar(20) 不足以容纳12121312312312啊啊啊啊啊aassasdasd

MYSQL实例查询结果如下

MYSQL实例?

MYSQL实例确实自动截断了,但是在项目中执行同样的sql发现并非如此,反而报错.

MYSQL实例
Data truncated for column '%s' at row %ld

MYSQL实例考虑到是同一个数据库,不存在模式不同,那么可能性应该出现在jdbcDriver上.

MYSQL实例查看jdbc源码

MYSQL实例
private void setupServerForTruncationChecks() throws SQLException {
  if (getJdbcCompliantTruncation()) {
    if (versionMeetsMinimum(5,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,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
      }
 
    }
  }
}

MYSQL实例查看getJdbcCompliantTruncation办法,其默认值为

MYSQL实例
private BooleanConnectionProperty jdbcCompliantTruncation = new BooleanConnectionProperty("jdbcCompliantTruncation",true,Messages.getString("ConnectionProperties.jdbcCompliantTruncation"),"3.1.2",MISC_CATEGORY,Integer.MIN_VALUE);

MYSQL实例因此从3.1.2版本在jdbcurl中如果没有设置jdbcCompliantTruncation那么默认将会执行不截断并且报错.

MYSQL实例那么加上参数是否可以呢?

MYSQL实例取舍一下:

MYSQL实例如果截断当出现比超长可能会有精度丢失的风险.

MYSQL实例因此建议还是在程序中检查.

MYSQL实例目前正在做关于使用hibernate validate的相关.

MYSQL实例以上就是关于MySQL 截断的讲解,大家如有疑问可以留言或者到本站社区交流讨论,共同进步,?感谢阅读,希望能赞助到大家,谢谢大家对本站的支持!

《MYSQL数据库MySql超长自动截断实例详解》是否对您有启发,欢迎查看更多与《MYSQL数据库MySql超长自动截断实例详解》相关教程,学精学透。编程之家PHP学院为您提供精彩教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读