文档章节

MySql超长自动截断

Mr_Qi
 Mr_Qi
发布于 2017/06/01 10:23
字数 498
阅读 309
收藏 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

粉丝 273
博文 350
码字总数 359193
作品 0
南京
程序员
mysql load或者mysqlimpoort 数据,txt格式,如何跳过数据格式错误的行?

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

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

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

jianblog
2013/07/03
359
0
Css 常用样式

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

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

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

BabyMason
2015/01/12
0
0
Chrome Dev更新,新Logo来了!

Chrome Dev 分支今日面向全平台更新到了 11.0.696.12,本次更新修复了若干 Bug,主要修复的 Bug 如下: Chrome Dev上的“纽约时报”应用程序崩溃; 同步登录界面被截断,显示不完整; 当鼠标...

老枪
2011/03/17
913
5

没有更多内容

加载失败,请刷新页面

加载更多

Shell编程(expect同步文件、指定host和同步文件、构建文件分发系统、批量执行命令)

expect脚本同步文件 需求:自动同步文件 实验准备: A机器:192.168.248.130 B机器:192.168.248.129 实现: 1.A机器编写4.expect脚本文件,内容如下所示: #!/usr/bin/expectset passwd "...

蛋黄_Yolks
34分钟前
2
0
ppwjs之bootstrap颜色:背景颜色

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
34分钟前
1
0
Ubuntu与 Fedora之对比

大家好。今天我将重点介绍两个流行的Linux发行版之间的一些特性和差异; Ubuntu 18.04和Fedora 28。它们都有自己的包管理; Ubuntu使用DEB,而Fedora使用RPM,但它们都具有相同的桌面环境(GNO...

linuxprobe16
38分钟前
2
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
昨天
3
0
开发5分钟,调试2小时 - 该如何debug?

几年来我在答疑群、论坛、公众号、知乎回答的各种问题,没有一万也有八千。其中有三分之二以上都是在帮人看报错,帮人 debug(调试代码)。 可以说,会不会 debug,有没有 debug 的意识,懂不...

crossin
昨天
4
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部