• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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 = 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的相关。

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

    您可能感兴趣的文章:
    • mysql5.7.19 winx64解压缩版安装配置教程
    • centos6.4下mysql5.7.18安装配置方法图文教程
    • MySQL5.7.18下载和安装过程图文详解
    • MySql中使用正则表达式查询的方法
    • php检测mysql表是否存在的方法小结
    上一篇:mysql 5.7.15 安装配置方法图文教程(windows)
    下一篇:mysql5.7.19 winx64安装配置方法图文教程(win10)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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