You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ClickHouse中插入全精度小数?解决Decimal类型截断问题

解决ClickHouse Decimal类型高精度数值截断问题

核心原因

你遇到的截断问题,本质是插入时用了浮点数(如Double)传递数值。Double类型仅能保留15-17位有效数字,而目标数值5914.922286612016543134有22位有效数字,转成Double后自然会丢失末尾精度,导致插入后被截断。

解决方案

1. 插入时以字符串形式传递高精度数值

直接将数值作为字符串写入INSERT语句,避免浮点数转换过程:

INSERT INTO db.high_precision_table (id, high_precision_value)
VALUES (1, '5914.922286612016543134');

这种方式会让ClickHouse直接解析字符串为Decimal类型,完整保留所有精度。

2. 客户端传递时禁用浮点数自动转换

如果使用客户端工具(如JDBC、Python Client等)插入数据,需确保客户端以字符串类型传递该字段,而非自动转为浮点数:

  • Python示例:使用clickhouse-driver时,明确以字符串传递参数:
    from clickhouse_driver import Client
    
    client = Client('localhost')
    client.execute(
        'INSERT INTO db.high_precision_table VALUES',
        [(1, '5914.922286612016543134')]
    )
    
  • JDBC示例:使用PreparedStatement时,用setString而非setDouble:
    String sql = "INSERT INTO db.high_precision_table (id, high_precision_value) VALUES (?, ?)";
    PreparedStatement pstmt = connection.prepareStatement(sql);
    pstmt.setInt(1, 1);
    pstmt.setString(2, "5914.922286612016543134");
    pstmt.executeUpdate();
    

3. 验证插入结果

插入后执行查询确认精度是否保留:

SELECT high_precision_value FROM db.high_precision_table WHERE id = 1;

预期返回完整数值5914.922286612016543134。

注意事项

  • 你定义的Decimal(72,38)足够容纳目标数值:72位总精度、38位小数位,目标数值整数部分4位、小数部分18位,完全符合要求,无需调整表结构。
  • 避免在任何中间环节将数值转为浮点数,包括数据生成、传输、客户端处理等步骤,全程以字符串或Decimal类型传递。

内容的提问来源于stack exchange,提问作者Jawakar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:28:11