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

Apache Ignite 3是否支持SQL DECIMAL类型?JDBC插入失败咨询

Apache Ignite 3 SQL DECIMAL类型支持及JDBC插入解决方案

一、Ignite 3对DECIMAL类型的支持

Ignite 3是支持SQL DECIMAL列类型的,你遇到的插入异常是早期版本JDBC Thin客户端的参数转换BUG导致的——客户端没有正确调用Ignite内部专门的DECIMAL转换方法,从而触发了断言错误。

二、问题根源

从调试代码可以看到,ConverterUtils#convert()方法明确禁止直接转换到BigDecimal类型,要求使用专门的convertToDecimal()方法,但JDBC客户端的setBigDecimal()参数绑定逻辑没适配这个要求,最终抛出异常。

三、解决办法

1. 用字符串传递DECIMAL参数

绕过setBigDecimal()的问题,改用setString()传递DECIMAL的字符串形式,让Ignite内部自行完成类型转换:

public class DecimalTest
{
    public static void main(String[] args) throws Exception {
        try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1:10801/")) {
            try (Statement stmt = conn.createStatement()) {
                stmt.executeUpdate(
                    "CREATE TABLE IF NOT EXISTS TEST (" +
                            "KEY_COL INT PRIMARY KEY, " +
                            "TEST_COL DECIMAL)"
                );
            }

            try (PreparedStatement stmt = conn.prepareStatement(
                    "INSERT INTO TEST (KEY_COL, TEST_COL) values (?,?)")) {
                stmt.setInt(1, 1);
                stmt.setString(2, "123"); // 替换setBigDecimal为setString传递数值字符串
                stmt.executeUpdate();
            }
        }
    }
}

2. 直接在SQL中写入DECIMAL字面量

如果插入的数值是固定的,可以直接把数值写在INSERT语句里:

try (Statement stmt = conn.createStatement()) {
    stmt.executeUpdate("INSERT INTO TEST (KEY_COL, TEST_COL) VALUES (1, 123.45)");
}

3. 升级到Ignite 3最新稳定版

该BUG已在Ignite 3的后续版本中被官方修复,升级后无需修改代码,直接使用setBigDecimal()就能正常插入数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:02:53