字段长度明显够,却报错被截断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 报错的上下文堆栈信息。