Kongdom
(Kongdom)
1
【 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'
1 个赞
数据库真NB
(Ti D Ber Rm Cf Adrg)
4
你查询出的结果是日期字段类型,插入的目标表是字符串的类型,类型不匹配。你把查询结果分别列出来,再改回字符串,应该就行了
update tmp_customer set c_id =‘19901201’ where c_no =‘1’
1 个赞
这行时间格式问题,月份超出范围了。mysql tidb
在任何版本都会报错。
2 个赞
登录时mysql命令加上–comment,查询就会发现有warnings信息,有问题只是隐藏了,插入会校验就有报错。
DBAER
(66666)
9
6.1 版本也有此问题,where 后面的条件导致类型转换
DBAER
(66666)
10
再补充一下,应该是跟sql_mode 有关 ,设置null ,即可插入,
3 个赞
dba远航
(Ti D Ber M Lo7 Bqhk)
12
INSERT INTO tmp_customer values(‘1’,‘19901901’); 这里面的19901901月份是不合法的,你更改为合理值试试,应该就可以了
Trouble
(Ti D Ber Qf Zc40ep)
13
没有,查询的数据是原表的数据,谓词的各种转化都是作为过滤的
wangccsy
(Ti D Ber Wc Tp L Gn I)
17
日期转换后溢出了,变成0年0月0日被认为是无效日期。
Kongdom
(Kongdom)
18
是的,但是昨天晚上奇怪就奇怪在,向两个表插入,一个表报错,另外一个表这样操作就不报错。感觉应该和目标表没关系。
1 个赞
Kongdom
(Kongdom)
19
1 个赞
Kongdom
(Kongdom)
20
很抱歉的通知您,客户环境不允许设置为null。不过者提供了一个方向,应该是sql_mode中的某个配置导致的
1 个赞
Kongdom
(Kongdom)
21
按说插入报错,查询也应该报错才对。毕竟插入的时候没有插入日期字段。
1 个赞