3.4. Debezium Db2 连接器如何映射数据类型

Db2 的数据类型在 Db2 SQL 数据类型 中进行了描述。

Db2 连接器代表对带有类似于行存在的表的事件的更改。event 包含每个列值的字段。该值在事件中如何代表取决于该列的 Db2 数据类型。这部分论述了这些映射。如果默认数据类型转换无法满足您的需要,您可以为连接器 创建自定义转换器

详情包括在以下部分:

基本类型

下表描述了连接器如何将每个 Db2 数据类型映射到 字面类型和 事件字段中 的语义类型

  • literal type 描述了如何使用 Kafka Connect 模式类型来表示: INT8,INT16,INT32,INT64,FLOAT32,FLOAT64,BOOLEAN,STRING,BYTES, ARRAY, MAP, 和 STRUCT
  • 语义类型 描述了 Kafka Connect 模式如何使用字段名称来捕获字段 的含义

表 3.10. Db2 基本数据类型的映射

Db2 数据类型字面类型(架构类型)语义类型(架构名称)和备注

布尔值

布尔值

只能从具有 BOOLEAN 类型列的表中获取快照。目前,Db2 上的 SQL Replication 不支持 BOOLEAN,因此 Debezium 无法在这些表上执行 CDC。考虑使用不同的类型。

BIGINT

INT64

不适用

二进制

BYTES

不适用

BLOB

BYTES

不适用

CHAR[(N)]

字符串

不适用

CLOB

字符串

不适用

DATE

INT32

io.debezium.time.Date

字符串表示时间戳没有时区信息

DECFLOAT

BYTES

org.apache.kafka.connect.data.Decimal

十进制

BYTES

org.apache.kafka.connect.data.Decimal

DBCLOB

字符串

不适用

DOUBLE

FLOAT64

不适用

整数

INT32

不适用

REAL

FLOAT32

不适用

SMALLINT

INT16

不适用

时间

INT32

io.debezium.time.Time

字符串表示没有时区信息

TIMESTAMP

INT64

io.debezium.time.MicroTimestamp

字符串表示时间戳没有时区信息

VARBINARY

BYTES

不适用

VARCHAR[(N)]

字符串

不适用

VARGRAPHIC

字符串

不适用

XML

字符串

io.debezium.data.Xml

字符串表示 XML 文档

如果存在,列的默认值会被传播到对应的字段的 Kafka Connect 模式。更改事件包含字段的默认值,除非给出了显式列值。因此,很少需要从 schema 获取默认值。

临时类型

除 Db2 的 DATETIMEOFFSET 数据类型外,其中包含时区信息,如何映射 temporal 类型取决于 time.precision.mode 连接器配置属性的值。以下小节描述了这些映射:

time.precision.mode=adaptive

time.precision.mode 配置属性设为 adaptive 时,默认连接器根据列的数据类型定义决定字面类型和语义类型。这样可确保事件 完全 表示数据库中的值。

表 3.11. time.precision.mode 被适应 的映射

Db2 数据类型字面类型(架构类型)语义类型(架构名称)和备注

DATE

INT32

io.debezium.time.Date

代表自 epoch 以来的天数。

TIME (0), TIME (1 ), TIME (2), TIME (3)

INT32

io.debezium.time.Time

代表过去几周的毫秒数,不包括时区信息。

TIME (4) , TIME (5), TIME (6)

INT64

io.debezium.time.MicroTime

代表过去几周的微秒数,不包括时区信息。

TIME (7)

INT64

io.debezium.time.NanoTime

代表过去几夜的纳秒数量,不包括时区信息。

日期

INT64

io.debezium.time.Timestamp

代表自 epoch 以来的毫秒数,不包含时区信息。

time.precision.mode=connect

time.precision.mode 配置属性设为 connect 时,连接器将使用 Kafka Connect 逻辑类型。当消费者只能处理内置的 Kafka Connect 逻辑类型且无法处理变量精度时间值时,这很有用。但是,因为 Db2 支持十分之一微秒的精度,使用 connect 时间精度的连接器会在数据库列带有 fractional second precision 值大于 3 时,导致精度下降

表 3.12. time.precision.modeconnect时的映射

Db2 数据类型字面类型(架构类型)语义类型(架构名称)和备注

DATE

INT32

org.apache.kafka.connect.data.Date

代表自 epoch 后的天数。

TIME([P])

INT64

org.apache.kafka.connect.data.Time

从中夜起代表毫秒的数量,不包括时区信息。Db2 允许 P 在 0-7 之间存储最多十分之一的微秒精度,但此模式在 P 大于 3 时会导致精度丢失。

日期

INT64

org.apache.kafka.connect.data.Timestamp

从 epoch 开始代表毫秒的数量,不包括时区信息。

时间戳类型

DATETIME 类型代表没有时区信息的时间戳。这些列根据 UTC 转换为等同的 Kafka Connect 值。例如,DATETIME 值 "2018-06-20 15:13:16.945104" 由 io.debezium.time.Timestamp 代表,值为 "1539)07596000"。

运行 Kafka Connect 和 Debezium 的 JVM 的时区不会影响这个转换。

表 3.13. 十进制类型

Db2 数据类型字面类型(架构类型)语义类型(架构名称)和备注

NUMERIC[(P[,S])]

BYTES

org.apache.kafka.connect.data.Decimal

scale 模式参数包含一个整数,它代表了十进制点的转换次数。connect.decimal.precision 模式参数包含一个代表给定十进制值精度的整数。

DECIMAL[(P[,S])]

BYTES

org.apache.kafka.connect.data.Decimal

scale 模式参数包含一个整数,它代表了十进制点的转换次数。connect.decimal.precision 模式参数包含一个代表给定十进制值精度的整数。