相同语句查询不报错,插入报错

【 TiDB 使用环境】生产环境
【 TiDB 版本】v6.5.2
已知存在非法日期字符,查询时不报错,将查询结果插入到表时报错。
可重现操作:

CREATE TABLE tmp_customer(c_no varchar(20), c_id varchar(20));
CREATE TABLE tmp_customer_import(c_no varchar(20), c_id varchar(20));
INSERT INTO tmp_customer values('1','19901901');
INSERT INTO tmp_customer values('2','19901001');
INSERT INTO tmp_customer values('3','19900901');

-- 查询日期相差18年以上的记录
SELECT * FROM tmp_customer
WHERE TIMESTAMPDIFF(YEAR, IFNULL(str_to_date(c_id,'%Y%m%d'),'2024-02-22'), '2024-02-22') >= 18

-- 插入日期相差18年以上的记录
INSERT INTO tmp_customer_import
SELECT * FROM tmp_customer
WHERE TIMESTAMPDIFF(YEAR, IFNULL(str_to_date(c_id,'%Y%m%d'),'2024-02-22'), '2024-02-22') >= 18

SQL 错误 [1292] [22001]: Data truncation: Incorrect datetime value: '0000-00-00 00:00:00'

确实复现了这个现象 V6.5.6

你查询出的结果是日期字段类型,插入的目标表是字符串的类型,类型不匹配。你把查询结果分别列出来,再改回字符串,应该就行了

字段类型不匹配,估计哪个版本都能复现出来吧

update tmp_customer set c_id =‘19901201’ where c_no =‘1’

1 个赞

这行时间格式问题,月份超出范围了。mysql tidb
在任何版本都会报错。

2 个赞

登录时mysql命令加上–comment,查询就会发现有warnings信息,有问题只是隐藏了,插入会校验就有报错。

6.1 版本也有此问题,where 后面的条件导致类型转换

再补充一下,应该是跟sql_mode 有关 ,设置null ,即可插入,

3 个赞

高手,学习了 :+1:

INSERT INTO tmp_customer values(‘1’,‘19901901’); 这里面的19901901月份是不合法的,你更改为合理值试试,应该就可以了

没有,查询的数据是原表的数据,谓词的各种转化都是作为过滤的

优秀,学习了

@Trouble ,看到了,应该是这个数据不合法

感谢指教

日期转换后溢出了,变成0年0月0日被认为是无效日期。

是的,但是昨天晚上奇怪就奇怪在,向两个表插入,一个表报错,另外一个表这样操作就不报错。感觉应该和目标表没关系。

:+1: :+1: :+1:还可以这么用,看来与表要默认加个 --comment了

:yum:很抱歉的通知您,客户环境不允许设置为null。不过者提供了一个方向,应该是sql_mode中的某个配置导致的

:joy:按说插入报错,查询也应该报错才对。毕竟插入的时候没有插入日期字段。