前言
原来的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的工具了
先找到需要修改的表,打开DDL
图中的表我已经都改成DateTime64了
复制这个DDL,到文本编辑器中,将DateTime改为DateTime64。
修改CREATE TABLE中的表名,将其改为另一个表名,使用DBeaver执行这个SQL,再建一张表
右键需要备份的表,选择“导出数据”
导出为SQL即可。
打开导出的SQL,批量修改INSERT INTO 后的表名,执行这个SQL(由于数据保密要求,这里就不截图了)
修改原来的表名
rename table `my_table` to `my_table_backup`;
修改改完字段类型的表的表名
rename table `my_table2` to `my_table`;
完成
这样就做到了既修改了clickhouse的列的数据类型,又做到数据不丢失