6.3. Debezium MySQL 连接器如何映射数据类型
Debezium MySQL 连接器代表对行的更改,这些事件的结构与行存在的表类似。事件包含每个列值的一个字段。该列的 MySQL 数据类型指定 Debezium 如何代表事件中的值。
存储字符串的列在 MySQL 中定义,并带有字符集和合并。当读取 binlog 事件中列值的二进制表示时,MySQL 连接器使用列的字符集。
连接器可以将 MySQL 数据类型映射到 literal 和 semantic 类型。
- 字面类型 :值如何使用 Kafka Connect 模式类型表示。
- 语义类型 : Kafka Connect 模式如何捕获字段的含义(schema 名称)。
如果默认数据类型转换不满足您的需要,您可以为连接器 创建自定义转换器。
以下部分详情:
基本类型
下表显示了连接器如何映射基本 MySQL 数据类型。
MySQL 类型 | 字面类型 | 语义类型 |
---|---|---|
|
| 不适用 |
|
| 不适用 |
|
|
|
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
|
精度仅用于确定存储大小。精度 |
|
|
从 MySQL 8.0.17 开始,非标准 FLOAT (M,D)和 DOUBLE (M,D)语法已弃用,并预期在以后的 MySQL 版本中删除对它的支持,将 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
|
N/A |
|
|
N/A |
|
|
N/A |
|
| 不适用 |
|
|
N/A |
|
|
N/A |
|
|
N/A |
|
| 不适用 |
|
|
N/A |
|
|
N/A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
时序类型
排除 TIMESTAMP
数据类型,MySQL temporal 类型取决于 time.precision.mode
连接器配置属性的值。对于 TIMESTAMP
列,它的默认值被指定为 CURRENT_TIMESTAMP
或 NOW
,值 1970-01-01 00:00:00
被用于 Kafka Connect schema 中的默认值。
MySQL 允许 DATE
, DATETIME
, 和 TIMESTAMP
为零值,因为在有些情况下首先使用零值而不是 null 值。当列定义允许 null 值或当列不允许 null 值时,MySQL 连接器将零值表示为 null 值。
没有时区的临时值
DATETIME
类型代表一个本地日期和时间,如 "2018-01-13 09:48:27"。正如您所见,没有时区信息。这些列会根据使用 UTC 的精度,将此类列转换为 epoch 毫秒或微秒。TIMESTAMP
类型代表一个没有时区信息的时间戳。当读取后,通过 MySQL 将 MySQL 从服务器(或会话的)当前时区转换为 UTC,从 UTC 写入服务器(或会话)当前时区。例如:
-
DATETIME
的值2018-06-20 06:37:03
变为1529476623000
。 -
TIMESTAMP
的值2018-06-20 06:37:03
变为2018-06-20T13:37:03Z
。
此类列转换为根据服务器(或会话)当前时区的 UTC 中等效的 io.debezium.time.ZonedTimestamp
。默认情况下,时区将从服务器查询。如果此操作失败,则必须由 database connectionTimeZone
MySQL 配置选项明确指定。例如,如果数据库的时区(通过 connectionTimeZone
选项全局配置或为连接器配置)是 "America/Los_Angeles",TIMESTAMP 值 "2018-06-20 06:37:03" 由 ZonedTimestamp
代表,值为 "2018-06-20T13:37:03Z"。
运行 Kafka Connect 和 Debezium 的 JVM 的时区不会影响这些转换。
有关 temporal 值的属性的更多详细信息,请参见 MySQL 连接器配置属性 的文档。
- time.precision.mode=adaptive_time_microseconds(default)
MySQL 连接器根据列的数据类型定义确定字面类型和语义类型,以便事件准确代表数据库中的值。所有时间字段都以微秒为单位。只有
00:00:00.000000
到23:59:59.999999
范围内的正TIME
字段值可以正确捕获。Expand 表 6.14. 当 time.precision.mode=adaptive_time_microseconds时映射 MySQL 类型 字面类型 语义类型 DATE
INT32
io.debezium.time.Date
代表自 epoch 后的天数。TIME[(M)]
INT64
io.debezium.time.MicroTime
代表微秒中的时间值,不包括时区信息。MySQL 允许M
在0-6
范围内。DATETIME, DATETIME (0), DATETIME (1), DATETIME (2), DATETIME (3)
INT64
io.debezium.time.Timestamp
代表 epoch 过的毫秒数,不包括时区信息。DATETIME (4), DATETIME (5), DATETIME (6)
INT64
io.debezium.time.MicroTimestamp
代表 epoch 过的微秒数,不包括时区信息。- time.precision.mode=connect
MySQL 连接器使用定义的 Kafka Connect 逻辑类型。这个方法比默认方法更精确,如果数据库列的 fractional second 精度 值大于
3
,则事件可能会更精确。只能处理00:00:00.000
到 23:59.999
范围内的值。仅在确保表中的TIME
值不能超过支持的范围时,设置time.precision.mode=connect
。预计会在 Debezium 的未来版本中删除connect
设置。Expand 表 6.15. time.precision.mode=connect时映射 MySQL 类型 字面类型 语义类型 DATE
INT32
org.apache.kafka.connect.data.Date
代表自 epoch 后的天数。TIME[(M)]
INT64
org.apache.kafka.connect.data.Time
代表自午夜起的微秒中的时间值,不包括时区信息。DATETIME[(M)]
INT64
org.apache.kafka.connect.data.Timestamp
代表自 epoch 后的毫秒数,不包括时区信息。
十进制类型
Debezium 连接器根据 decimal.handling.mode
连接器配置属性的 设置处理十进制。
- decimal.handling.mode=precise
Expand 表 6.16. 当 decimal.handling.mode=precise时映射 MySQL 类型 字面类型 语义类型 NUMERIC[(M[,D])]
BYTES
org.apache.kafka.connect.data.Decimal
scale
模式参数包括一个整数,它代表了十进制小数点移动了多少位。DECIMAL[(M[,D])]
BYTES
org.apache.kafka.connect.data.Decimal
scale
模式参数包括一个整数,它代表了十进制小数点移动了多少位。- decimal.handling.mode=double
Expand 表 6.17. 当 decimal.handling.mode=double时映射 MySQL 类型 字面类型 语义类型 NUMERIC[(M[,D])]
FLOAT64
不适用
DECIMAL[(M[,D])]
FLOAT64
不适用
- decimal.handling.mode=string
Expand 表 6.18. 当 decimal.handling.mode=string时映射 MySQL 类型 字面类型 语义类型 NUMERIC[(M[,D])]
字符串
不适用
DECIMAL[(M[,D])]
字符串
不适用
布尔值
MySQL 以特定的方式在内部处理 BOOLEAN
值。BOOLEAN
列内部映射到 TINYINT (1)
数据类型。在流期间创建表时,它会使用正确的 BOOLEAN
映射,因为 Debezium 接收原始 DDL。在快照期间,Debezium 执行 SHOW CREATE TABLE
来获取表定义,该定义为 BOOLEAN
和 TINYINT (1)
列返回 TINYINT (1)
列。然后,Debezium 无法获取原始类型映射,因此映射到 TINYINT (1)
。
为了允许您将源列转换为布尔值数据类型,Dein yIntOneToBooleanConverter
自定义转换器,您可以使用以下方法之一使用:
-
将所有
TINYINT (1)
或TINYINT (1) UNSIGNED
列映射到BOOLEAN
类型。 使用以逗号分隔的正则表达式列表枚举列的子集。
要使用这种类型的转换,您必须使用selector
参数设置converters
配置属性,如下例所示:converters=boolean boolean.type=io.debezium.connector.mysql.converters.TinyIntOneToBooleanConverter boolean.selector=db1.table1.*, db1.table2.column1
converters=boolean boolean.type=io.debezium.connector.mysql.converters.TinyIntOneToBooleanConverter boolean.selector=db1.table1.*, db1.table2.column1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意:当快照执行
SHOW CREATE TABLE
时,MySQL8 不会显示tinyint 未签名
类型的长度,这意味着此转换器不起作用。新选项length.checker
可以解决这个问题,默认值为true
。禁用length.checker
并指定需要转换为selector
属性的列,而不是根据类型转换所有列,如下例所示:converters=boolean boolean.type=io.debezium.connector.mysql.converters.TinyIntOneToBooleanConverter boolean.length.checker=false boolean.selector=db1.table1.*, db1.table2.column1
converters=boolean boolean.type=io.debezium.connector.mysql.converters.TinyIntOneToBooleanConverter boolean.length.checker=false boolean.selector=db1.table1.*, db1.table2.column1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
空间类型
目前,Debezium MySQL 连接器支持以下空间数据类型:
MySQL 类型 | 字面类型 | 语义类型 |
---|---|---|
|
|
|