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

Oracle NUMBER转ClickHouse兼容类型:CDC数据读取报错求助

解决Debezium Oracle CDC VariableScaleDecimal与ClickHouse类型兼容问题

方案一:修改Debezium连接器配置(推荐)

Debezium默认会把Oracle的可变精度NUMBER类型序列化为VariableScaleDecimal Avro记录,我们可以通过配置让它直接输出ClickHouse兼容的类型:

  • 转成字符串类型:在连接器配置中添加
decimal.handling.mode=string

NUMBER会被转成字符串,ClickHouse用String类型接收即可,后续可按需转成Decimal。

  • 转成标准Avro Decimal类型:如果需要保留数值类型,配置:
decimal.handling.mode=precise
decimal.precision=38  # 根据业务需求设置最大精度
decimal.scale=18       # 设置默认刻度

此时Debezium会输出标准的Avro Decimal,ClickHouse用Decimal(38,18)即可直接接收。

方案二:ClickHouse端自定义解析(无法修改Debezium配置时使用)

如果不能调整Debezium配置,需要在ClickHouse中先接收VariableScaleDecimal的结构体,再手动解析:

  1. 创建Kafka接收表:将USER_CODE定义为包含scale和value的Tuple类型
CREATE TABLE kafka_oracle_cdc
(
    USER_CODE Tuple(scale Int32, value String)
)
ENGINE = Kafka
SETTINGS
    kafka_broker_list = 'kafka:9092',
    kafka_topic_list = 'your_oracle_topic',
    kafka_group_name = 'clickhouse_cdc_group',
    kafka_format = 'AvroConfluent',
    kafka_schema_registry_url = 'http://schema-registry:8081';
  1. 创建解析表和物化视图:将二进制的value解析为Decimal
-- 最终存储表
CREATE TABLE oracle_data
(
    USER_CODE Decimal(38, 18)
)
ENGINE = MergeTree
ORDER BY tuple();

-- 物化视图自动解析数据
CREATE MATERIALIZED VIEW mv_oracle_data TO oracle_data AS
SELECT
    toDecimal(
        reinterpretAsInt128(reverse(unhex(USER_CODE.value))),
        USER_CODE.scale
    ) AS USER_CODE
FROM kafka_oracle_cdc;
  • 说明:Debezium的value字段是大端字节序的二进制补码,reverse转为小端后用reinterpretAsInt128转成整数,再通过toDecimal指定刻度。如果数值精度超过128位,可先转成字符串再处理:
toDecimal(
    toString(reinterpretAsInt128(reverse(unhex(USER_CODE.value)))),
    USER_CODE.scale
) AS USER_CODE

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:55:10