向被限定长度的列中插入超长数据,数据被截断

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

  • 【TiDB 版本】:5.7.25-TiDB-v4.0.4
  • 【问题描述】:
    向被限定长度的列中插入超长数据,数据被截断

CREATE TABLE `tc` (
  `ds_id` varchar(5) NOT NULL, -- 限制文本长度为5个字符
  `name` varchar(5) DEFAULT NULL, -- 限制文本长度为5个字符
  PRIMARY KEY (`ds_id`)
);
-- 结果:成功,期望:成功
insert into tc(ds_id, name) values('00001', 'name1');
-- 结果:成功,并且name被截断成name1,期望:失败,
insert into tc(ds_id, name) values('00002', 'name1234');

查询:

select * from tc;

查询结果:

ds_id name
00001 name1
00002 name1

你好,请提供下 select @@sql_mode

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

感谢反馈,我们看下。

辛苦将 sql_mode 完整的执行结果看下,并且反馈下 select tidb_version();

这边使用上面提供的 sql_mode 执行测试语句会有如下报错:
MySQL [test]> set session sql_mode = ‘ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’;
Query OK, 0 rows affected (0.01 sec)

MySQL [test]> insert into tc(ds_id, name) values(‘00003’, ‘name1234’); ERROR 1406 (22001): Data too long for column ‘name’ at row 1

不好意思,insert into这个没问题,有其他同事在改STRICT_TRANS_TABLES参数影响到我的测试结果了。
另外一个问题是load data时会出现截断的问题
a.csv文件内容

ds_id,name
00003,name33333

load data语句:

load data local infile 'C:\\Users\\Admin\\Desktop\\a.csv' ignore into table tc columns enclosed by '"' terminated by ',' LINES TERMINATED BY '\
'
ignore 1 lines (ds_id, name)

查询结果:

ds_ id name
00003 name3


您好,load data 是会截断的,这个是符合预期的,这个是 mysql 5.7.29 版本的表现。

tidb 和 mysql 是保持了一致的。