文档章节

MySql超长自动截断

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

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

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

charles1991
2015/10/20
301
2
mysql由于字段太长插入时截断插入但java后台却报错

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

BabyMason
2015/01/12
0
0
perl 格式化输出能自适应变长字符串么?

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

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

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

JUKE
2016/12/10
283
0
mysql_数据库设计类型选择及优化

数据库设计原则: a,更小的通常更好。 应该尽量使用可以正确存储数据的最小数据类型。如只要存储0-200,tinyint unsigned更好 b,简单就好 简单的数据类型的操作需要更少的cpu周期。同时后期...

skanda
2015/03/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

node安装cnpm

npm install -g cnpm --registry=https://registry.npm.taobao.org

笑丶笑
13分钟前
1
0
OSChina 周三乱弹 —— 夜半回家,推门不动

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @胖达panda :分享陶晶莹/张雨生的单曲《我期待》 《我期待》- 陶晶莹/张雨生 手机党少年们想听歌,请使劲儿戳(这里) @cc_z :熬夜一时爽,...

小小编辑
25分钟前
159
4
验证码

response生成验证码 验证码的作用:防止恶意注册、攻击等 网站上看到的验证码,实际上都是一些图片,而这些图片都是程序(Servlet)生成的! package day19.test; import java.awt.Color; i...

码农屌丝
今天
1
0
day147-2018-11-14-英语流利阅读-待学习

《毒液》刚刚上映,创造漫威宇宙的人却走了 雪梨 2018-11-14 1.今日导读 中国的金庸创造了侠义英雄和江湖传奇,而大洋彼岸的斯坦·李也同样创造了一个绚烂璀璨的漫威宇宙,他构思的每个超级英...

飞鱼说编程
今天
10
0
CentOS 安装PHP5和PHP7

安装PHP5 下载解压二进制包 [root@test-a src]# cd /usr/local/src/[root@test-a src]# wget http://cn2.php.net/distributions/php-5.6.32.tar.bz2[root@test-a src]# tar jxvf php-5.6......

野雪球
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部