欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySql超长自动截断实例详解

程序员文章站 2022-06-11 18:51:05
mysql超长自动截断实例详解 小伙伴问到一个问题,为啥在项目中调用插入或者更新语句时超长的字无法自动截断,而在navicat中直接执行是可以自动截断的? 如下...

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

查询结果如下

 MySql超长自动截断实例详解

确实自动截断了,但是在项目中执行同样的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 截断的讲解,大家如有疑问可以留言或者到本站社区交流讨论,共同进步, 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!