java操作clickhouse数据库,执行insert的时候,报错:
Exception in thread "main" ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 69, host: xx.xx.xx.xxx, port: xxxx; Code: 69, e.displayText() = DB::Exception: Decimal value is too small (version 19.16.2.2 (official build))at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.specify(ClickHouseExceptionSpecifier.java:58)at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.specify(ClickHouseExceptionSpecifier.java:28)at ru.yandex.clickhouse.ClickHouseStatementImpl.checkForErrorAndThrow(ClickHouseStatementImpl.java:771)at ru.yandex.clickhouse.ClickHouseStatementImpl.getInputStream(ClickHouseStatementImpl.java:570)at ru.yandex.clickhouse.ClickHouseStatementImpl.executeQuery(ClickHouseStatementImpl.java:122)at ru.yandex.clickhouse.ClickHouseStatementImpl.executeQuery(ClickHouseStatementImpl.java:105)at ru.yandex.clickhouse.ClickHouseStatementImpl.executeQuery(ClickHouseStatementImpl.java:100)at ru.yandex.clickhouse.ClickHouseStatementImpl.executeQuery(ClickHouseStatementImpl.java:95)at ru.yandex.clickhouse.ClickHouseStatementImpl.execute(ClickHouseStatementImpl.java:196)at com.Xxx.java:102)
Caused by: java.lang.Throwable: Code: 69, e.displayText() = DB::Exception: Decimal value is too small (version 19.16.2.2 (official build))at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.specify(ClickHouseExceptionSpecifier.java:53)... 9 more
分析
出现Decimal value is too small这个错误,肯定是Decimal类型的字段格式不对。
经检查分析,有个字段入参的小数点后位数太多,就会报这个错。
我们在新建表的时候,会指定Decimal类型的精度,比如Decimal(32,15);
注意这个15,如果小数点后超过15位,他就会报错,提醒你属性精度太小。让你提高精度。
insert into aa(price) values(0.3499999940395356);
解决
1.可以重新设置表的属性精度
2.如果不需要那么高的精度,可以在入库的时候先对BigDecimal类型做个四舍五入的去精度,比如保留4位小数,结果如下:
BigDecimal auction_price = new BigDecimal(“0.3499999940395356”).setScale(4, BigDecimal.ROUND_HALF_UP);
最终auction_price=0.3500