报错记录解决Clickhouse DateTime保存报错问题:Cannot parse string ‘XX‘ as DateTime: syntax error at position

Posted DCTANT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了报错记录解决Clickhouse DateTime保存报错问题:Cannot parse string ‘XX‘ as DateTime: syntax error at position相关的知识,希望对你有一定的参考价值。

前言

原来的clickhouse insert方法使用的clickhouse0.3.2版本,不会报任何错,Java类使用的也是Date类型,但是更换到0.4.0版本的clickhouse驱动后,保存数据就开始报这个错,如下图所示:

解决方案

看到这个问题后感觉一脸懵逼,不就是换了一个clickhouse的驱动版本吗,从clickhouse-jdbc-0.3.2.jar换到clickhouse-jdbc-0.4.0.jar,怎么时间保存就报错了呢?

然后发现报错在

而这个值是毫秒,我就意识到可能是DateTime类型的长度不够了,不足以存入毫秒值,因此只需要将该字段的时间类型改为DateTime64即可,问题就能顺利解决!

但是又有一个新的问题,之前的那些数据怎么办,Clickhouse是无法直接改变字段类型的。

修改clickhouse的字段类型

我这里全程使用DBeaver操作,这是少数能直接操作clickhouse的工具了

  1. 先找到需要修改的表,打开DDL

图中的表我已经都改成DateTime64了

  1. 复制这个DDL,到文本编辑器中,将DateTime改为DateTime64。

  1. 修改CREATE TABLE中的表名,将其改为另一个表名,使用DBeaver执行这个SQL,再建一张表

  1. 右键需要备份的表,选择“导出数据”

导出为SQL即可。

  1. 打开导出的SQL,批量修改INSERT INTO 后的表名,执行这个SQL(由于数据保密要求,这里就不截图了)

  1. 修改原来的表名

rename table `my_table` to `my_table_backup`;

  1. 修改改完字段类型的表的表名

rename table `my_table2` to `my_table`;

完成

这样就做到了既修改了clickhouse的列的数据类型,又做到数据不丢失

以上是关于报错记录解决Clickhouse DateTime保存报错问题:Cannot parse string ‘XX‘ as DateTime: syntax error at position的主要内容,如果未能解决你的问题,请参考以下文章

python datetime.datetime is not JSON serializable 报错问题解决

Apache Flink写入Clickhouse报错 code: 1002, ip:8123 failed to respond

Apache Flink写入Clickhouse报错 code: 1002, ip:8123 failed to respond

clickhouse[未解决] clickhouse Exception: Table is in readonly mode

关于module ‘datetime‘ has no attribute ‘now‘报错解决方案

clickhouse数据库使用jdbc存储毫秒和纳秒