MySql中关于超长自动截断的案例详解


本文摘自PHP中文网,作者黄舟,侵删。

这篇文章主要介绍了MySql超长自动截断实例详解的相关资料,这里通过实例来说明如何实现自动截断的功能,需要的朋友可以参考下

MySql超长自动截断实例详解

小伙伴问到一个问题,为啥在项目中调用插入或者更新语句时超长的字无法自动截断,而在navicat中直接执行是可以自动截断的?

如下


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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


1

2

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发现并非如此,反而报错。


1

Data truncated for column '%s' at row %ld

考虑到是同一个数据库,不存在模式不同,那么可能性应该出现在jdbcDriver上。

查看jdbc源码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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方法,其默认值为


1

2

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中关于超长自动截断的案例详解的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

mysql update 语句一个“经典”的坑

mysql无法启动的解决办法示例分享

mysql使用变量实现各种排序实例详解

mysql字符串字段如何按照逗号截取进行储存

介绍高级进阶的mysql数据库sql语句

mysql如何修改表字符编码

详细介绍windows下mysql安装教程

数据库怎么做单表查询?

怎么删除mysql用户名

浅谈mysql存储引擎选择 innodb与myisam的优缺点分析

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...