4.2. Debezium JDBC 连接器如何映射数据类型
Debezium JDBC sink 连接器使用逻辑或原语类型解析列的数据类型。原语类型包括整数、浮点、布尔值、字符串和字节数等值。通常,这些类型只通过特定的 Kafka Connect Schema
类型代码表示。逻辑数据类型更为复杂的类型,包括 Struct (基于 Struct
)类型,其具有固定的字段名称和模式,或者以特定编码表示的值,如自 epoch 起的天数。
以下示例演示了原语和逻辑数据类型的代表结构:
Primitive 字段 schema
{ "schema": { "type": "INT64" } }
逻辑字段模式
[ "schema": { "type": "INT64", "name": "org.apache.kafka.connect.data.Date" } ]
Kafka Connect 不是这些复杂逻辑类型的唯一源。实际上,Debezium 源连接器生成更改事件,它们具有类似逻辑类型的字段,以表示各种不同的数据类型,包括但不限于、时间戳、日期甚至 JSON 数据。
Debezium JDBC sink 连接器使用这些原语和逻辑类型,将列的类型解析为 JDBC SQL 代码,后者代表列的类型。然后,底层 Hibernate 持久性框架使用这些 JDBC SQL 代码,将列的类型解析为使用中的逻辑数据类型。下表说明了 Kafka Connect 和 JDBC SQL 类型之间以及 Debezium 和 JDBC SQL 类型之间的原语和逻辑映射。实际的最后一列类型因每种数据库类型而异。
原语类型 | JDBC SQL 类型 |
---|---|
INT8 | Type.TINYINT |
INT16 | Type.SMALLINT |
INT32 | Type.INTEGER |
INT64 | Type.BIGINT |
FLOAT32 | Type.FLOAT |
FLOAT64 | Type.DOUBLE |
布尔值 | Type.BOOLEAN |
字符串 | Type.CHAR, Types.NCHAR, Types.VARCHAR, Types.NVARCHAR |
BYTES | 类型.VARBINARY |
逻辑类型 | JDBC SQL 类型 |
---|---|
org.apache.kafka.connect.data.Decimal | Type.DECIMAL |
org.apache.kafka.connect.data.Date | type.DATE |
org.apache.kafka.connect.data.Time | Type.TIMESTAMP |
org.apache.kafka.connect.data.Timestamp | Type.TIMESTAMP |
逻辑类型 | JDBC SQL 类型 |
---|---|
io.debezium.time.Date | type.DATE |
io.debezium.time.Time | Type.TIMESTAMP |
io.debezium.time.MicroTime | Type.TIMESTAMP |
io.debezium.time.NanoTime | Type.TIMESTAMP |
io.debezium.time.ZonedTime | Types.TIME_WITH_TIMEZONE |
io.debezium.time.Timestamp | Type.TIMESTAMP |
io.debezium.time.MicroTimestamp | Type.TIMESTAMP |
io.debezium.time.NanoTimestamp | Type.TIMESTAMP |
io.debezium.time.ZonedTimestamp | Types.TIMESTAMP_WITH_TIMEZONE |
io.debezium.data.VariableScaleDecimal | Type.DOUBLE |
如果数据库不支持带有时区的时间或时间戳,则映射会解析到没有时区的等效时间。
逻辑类型 | MySQL SQL 类型 | PostgreSQL SQL 类型 | SQL Server SQL 类型 |
---|---|---|---|
io.debezium.data.Bits |
|
|
|
io.debezium.data.Enum |
| Type.VARCHAR | 不适用 |
io.debezium.data.Json |
|
| 不适用 |
io.debezium.data.EnumSet |
| 不适用 | 不适用 |
io.debezium.time.Year |
| 不适用 | 不适用 |
io.debezium.time.MicroDuration | 不适用 |
| 不适用 |
io.debezium.data.Ltree | 不适用 |
| 不适用 |
io.debezium.data.Uuid | 不适用 |
| 不适用 |
io.debezium.data.Xml | 不适用 |
|
|
除了上述原语和逻辑映射外,如果更改事件的来源是 Debezium 源连接器、列类型的解析及其长度、精度和规模,可以通过启用列或数据类型传播来进一步影响。要强制传播,必须在源连接器配置中设置以下属性之一:
-
column.propagate.source.type
-
datatype.propagate.source.type
Debezium JDBC sink 连接器应用具有较高优先级的值。
例如,假设更改事件中包含以下字段模式:
Debezium 更改事件字段 schema,启用了列或数据类型传播
{ "schema": { "type": "INT8", "parameters": { "__debezium.source.column.type": "TINYINT", "__debezium.source.column.length": "1" } } }
在上例中,如果没有设置 schema 参数,Debezium JDBC sink 连接器会将此字段映射到 type .SMALLINT
。Type.SMALLINT
可以有不同的逻辑数据库类型,具体取决于数据库问题。对于 MySQL,示例中的列类型转换为没有指定长度的 TINYINT
列类型。如果为源连接器启用了列或数据类型传播,Debezium JDBC sink 连接器会使用映射信息来优化数据类型映射过程,并使用类型 TINYINT (1)
创建列。
通常,当源和 sink 数据库使用相同的数据库类型时,使用列或数据类型传播的影响会大得多。