香港云主机最佳企业级服务商!

ADSL拨号VPS包含了中国大陆(联通,移动,电信,)

中国香港,国外拨号VPS。

当前位置:云主机 > MYSQL >

电信ADSL拨号VPS
联通ADSL拨号VPS
移动ADSL拨号VPS

MySql超长自动截断实例详解


时间:2020-11-03 13:31 作者:admin610456


mysql/' target='_blank'>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 截断的讲解,大家如有疑问可以留言或者到本站社区交流讨论,共同进步,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(责任编辑:admin)






帮助中心
会员注册
找回密码
新闻中心
快捷通道
域名登录面板
虚机登录面板
云主机登录面板
关于我们
关于我们
联系我们
联系方式

售前咨询:17830004266(重庆移动)

企业QQ:383546523

《中华人民共和国工业和信息化部》 编号:ICP备00012341号

Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究

云官方微信

在线客服

  • 企业QQ: 点击这里给我发消息
  • 技术支持:383546523

  • 公司总台电话:17830004266(重庆移动)
  • 售前咨询热线:17830004266(重庆移动)