文档章节

MySql超长自动截断

Mr_Qi
 Mr_Qi
发布于 2017/06/01 10:23
字数 498
阅读 391
收藏 2

小伙伴问到一个问题,为啥在项目中调用插入或者更新语句时超长的字无法自动截断,而在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的相关。

© 著作权归作者所有

共有 人打赏支持
Mr_Qi

Mr_Qi

粉丝 280
博文 359
码字总数 369228
作品 0
南京
程序员
私信 提问
mysql load或者mysqlimpoort 数据,txt格式,如何跳过数据格式错误的行?

大家好,最近使用mysql导入txt文件到数据库中,但是发现使用mysqlimport导入数据的时候,txt中某行某个字段超长,只是发生警报,而且数据被截断导入到库了。这种情况,怎么设置跳过这样一行?...

charles1991
2015/10/20
314
2
perl 格式化输出能自适应变长字符串么?

使用format输出,字符串长度超过预设时会被截断。有办法能让超长字符串自动换行方法么?或者只能预先计算字符串长度,动态创建format

jianblog
2013/07/03
2.1K
0
Css 常用样式

table(td) 不自动换行,超长自动截断用...代替显示

JUKE
2016/12/10
283
0
mysql由于字段太长插入时截断插入但java后台却报错

LengF:在看《PHP高级漏洞审核技术》认真的看了这两点,暂且记下。 对于很多web应用文件在很多功能是不容许重复数据的,比如用户注册功能等。一般的应用程序对于提交注册的username和数据库里...

BabyMason
2015/01/12
0
0
【BUG之group_concat默认长度限制】

问题:mysql数据库使用group_concat将多个id组成字符串数组,一共200个,到160个被截断; 原因:mysql的group_concat默认连接长度为1024字符,也就是说你需要连接后的连接超过1024字符,它只...

卯金刀GG
2018/11/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis客户端连接以及持久化数据

一、介绍 之前我们讲解了Redis的结构与指令,其实很简单,我也没有过多的讲解,这次我们讲解一下Redis连接客户端以及持久化方案。 1、上文中我们针对redis的数据操作都是在服务器中使用命令执...

编辑之路
16分钟前
1
0
分布式服务化系统一致性的“最佳实干”

1 背景 一致性是一个抽象的、具有多重含义的计算机术语,在不同应用场景下,有不同的定义和含义。在传统的IT时代,一致性通常指强一致性,强一致性通常体现在你中有我、我中有你、浑然一体;...

青梅煮酒论英雄
22分钟前
3
0
命令行查看.net core的版本

dotnet --version

笑丶笑
23分钟前
0
0
Linux 多版本python3、python2共存安装

封装docker包需要python3环境,系统自带python2,yum等程序依赖它,避免异常问题,达到共存,增加python3支持。具体如下: 1、依赖环境 yum -y install zlib-devel bzip2-devel openssl-deve...

悲喜世界
29分钟前
0
0
折腾Java设计模式之策略模式

博客原文地址 简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。简单理解就是一组算法,可以互换,再简单点策略就是封装算...

大萌小路
38分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部