字段长度明显够,却报错被截断ERROR 1265 (01000): Data Truncated

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v2.1.8
  • 【问题描述】:

字段类型:imei2 varchar(128) DEFAULT NULL ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

执行更新:报错数据截断 mysql> update emlog.COUNTER_ORDERREC_CLEAN set imei2 =‘a’ where imei = ‘8655****9435702’; ERROR 1265 (01000): Data Truncated

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

3.0.3 版本简单测试无法重现,麻烦提供下具体的表结构,用于排查。

给你表结构不一定必现,我测试相同的表结构,把数据导进去,没有出现,但是这张表出现了

explain 一下 update 语句看下执行计划。另外方便的话还是希望能提供表结构,方便这边做针对性测试。

CREATE TABLE COUNTER_CLEAN ( EITIME datetime DEFAULT NULL , EUTIME datetime DEFAULT NULL , serverid bigint(20) DEFAULT NULL , ordersno bigint(20) DEFAULT NULL , orderid char(10) DEFAULT NULL , orderdate bigint(20) DEFAULT NULL , operdate bigint(20) DEFAULT NULL , opertime bigint(20) DEFAULT NULL , custid bigint(20) DEFAULT NULL , custname char(16) DEFAULT NULL , orgid char(4) DEFAULT NULL , brhid char(4) DEFAULT NULL , fundid bigint(20) DEFAULT NULL , moneytype varchar(32) DEFAULT NULL , secuid char(10) DEFAULT NULL , rptsecuid char(10) DEFAULT NULL , market varchar(32) DEFAULT NULL , zqdm char(8) DEFAULT NULL , stkname char(8) DEFAULT NULL , stktype char(1) DEFAULT NULL , wtjg decimal(9,0) DEFAULT NULL , wtsl bigint(20) DEFAULT NULL , mmlb varchar(32) DEFAULT NULL , wtzt varchar(32) DEFAULT NULL, wtfs varchar(32) DEFAULT NULL, matchqty bigint(20) DEFAULT NULL , orderfrzamt decimal(19,0) DEFAULT NULL , clearamt decimal(19,0) DEFAULT NULL , matchamt decimal(19,0) DEFAULT NULL , ordertype char(1) DEFAULT NULL , nightflag char(1) DEFAULT NULL , cancelflag char(1) DEFAULT NULL , stkdiff bigint(20) DEFAULT NULL, ip varchar(1076) DEFAULT NULL , lip1 varchar(1076) DEFAULT NULL , mac1 varchar(1076) DEFAULT NULL , imei varchar(4000) DEFAULT NULL , osv varchar(540) DEFAULT NULL , clitype varchar(540) DEFAULT NULL , client varchar(540) DEFAULT NULL , dcqd varchar(540) DEFAULT NULL , sbxh varchar(540) DEFAULT NULL , cpu varchar(1076) DEFAULT NULL , pi varchar(1076) DEFAULT NULL , hd varchar(1076) DEFAULT NULL , pcn varchar(1076) DEFAULT NULL , sno varchar(540) DEFAULT NULL , vol varchar(540) DEFAULT NULL , imsi varchar(540) DEFAULT NULL , phone varchar(540) DEFAULT NULL , version varchar(1076) DEFAULT NULL , cancelqty bigint(22) DEFAULT NULL , imei2 varchar(128) DEFAULT NULL , KEY IDX_COUNTER_ORDERREC_O (orderdate), KEY IDX_COUNTER_ORDERREC_F (fundid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

经过测试还是不能重现,能够提供一行可以重现的数据用于测试吗?

你测试的版本需要和我一样,不能是3.0.3的版本;第二,给你数据,也不一定重现,我重新建立一个测试表,表结构一样,并且插入报错的数据,进行更新测试,不报错,所以给你也不一定报错;现在的问题,是能不能找出报错的原因,比如像oracle的一些内部trace 工具,可以跟踪到报错的调用关系;

先发一下 tidb 日志吧,里面有 Data Truncated 报错的上下文堆栈信息。