0 错误原因
Caused by: java.sql.SQLException: Value '80236!B25CGSFBY-AL-B-5A7E423349804A31-2025000320250032394.001B010020250023653460002026-06-07 17:19:002020-06-08 17:19:001900-01-01 00:00:001900-01-01 00:00:001900-01-01 00:00:00S0200608171910137-100110.000.000.006������GTV8������������������������������������������ A
wanzongfeng2020-06-08 17:19:00NaN1900-01-01 00:00:00 ���������0000-00-00 00:00:002021-02-19 14:21:442021-02-19 14:21:44����������������:21:44������:21:44�����' can not be represented as java.sql.Timestamp
1 原因分析
原因分析:
'0000-00-00 00:00:00' 这个时间不能用 Java 来表示。虽然数据库中可以存放这个值,但是 Java 中的时间都是从 1970 年开始的。格林威治时间 1970年01月01日00时00分00秒(UTC+8北京时间1970年01月01日08时00分00秒),所以你这个 '0000-00-00 00:00:00' 的时间,Java 表示不了,所以就抛出了这个异常。
2 解决方法
解决方法:
--connect "jdbc:mysql://${mysql_host}:${mysql_port}/${1}?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull"
主要添加:&zeroDateTimeBehavior=convertToNull即可
MySQL 的官方资料对 zeroDateTimeBehavior 属性做出了详细的解释,相见参考资料。
设置 zeroDateTimeBehavior 属性,当遇到 DATETIME 值完全由 0 组成时,最终的有效值可以设置为,异常(exception),一个近似值(round),或将这个值转换为 null(convertToNull)。
默认情况为 exception,设置这个属性会抛出一个 SQLException 异常,也就是文章开头所说到的异常。其 SQLSate 码为 S1009。这个状态码在写存储过程处理异常时也可以用到。
convertToNull,返回 null 来替代 0000-00-00 这样的日期。