5.3. Debezium MySQL 连接器如何映射数据类型


Debezium MySQL 连接器代表对行的更改,这些事件的结构与行存在的表类似。事件包含每个列值的一个字段。该列的 MySQL 数据类型指定 Debezium 如何代表事件中的值。

存储字符串的列在 MySQL 中定义,并带有字符集和合并。当读取 binlog 事件中列值的二进制表示时,MySQL 连接器使用列的字符集。

连接器可以将 MySQL 数据类型映射到 literal 和 semantic 类型。

  • 字面类型 :值如何使用 Kafka Connect 模式类型表示。
  • 语义类型 : Kafka Connect 模式如何捕获字段的含义(schema 名称)。

如果默认数据类型转换不满足您的需要,您可以为连接器 创建自定义转换器。

以下部分详情:

基本类型

下表显示了连接器如何映射基本 MySQL 数据类型。

表 5.13. 基本类型映射的描述
MySQL 类型字面类型语义类型

BOOLEAN, BOOL

布尔值

不适用

BIT(1)

布尔值

不适用

BIT(>1)

BYTES

io.debezium.data.Bits
。length 模式参数包含一个代表位数的整数。byte[] 包含 little-endian 表单中的位,使用 sized 来包含指定数量的位。例如,其中 n 为 bit:
numBytes = n/8 +(n%8== 0 ?0 : 1)

TINYINT

INT16

不适用

SMALLINT[(M)]

INT16

不适用

MEDIUMINT[(M)]

INT32

不适用

INT, INTEGER[(M)]

INT32

不适用

BIGINT[(M)]

INT64

不适用

REAL[(M,D)]

FLOAT32

不适用

FLOAT[(P)]

FLOAT32 或 FLOAT64

精度仅用于确定存储大小。精度 P 从 0 到 23 会导致 4 字节单precision FLOAT32 列。从 24 到 53 的精度 P 会产生 8 字节双precision FLOAT64 列。

FLOAT (M,D)

FLOAT64

从 MySQL 8.0.17 开始,非标准 FLOAT (M,D)和 DOUBLE (M,D)语法已弃用,并预期在以后的 MySQL 版本中删除对它的支持,将 FLOAT64 设置为默认值。

DOUBLE[(M,D)]

FLOAT64

不适用

CHAR(M)]

字符串

不适用

VARCHAR(M)]

字符串

不适用

BINARY (M)]

BYTES 或 STRING

N/A
根据 binary.handling.mode 连接器配置属性设置,一个原始字节(默认)、base64 编码的 String 或 base64-url-safe-encoded String 或十六进制编码的字符串。

VARBINARY (M)]

BYTES 或 STRING

N/A
根据 binary.handling.mode 连接器配置属性设置,一个原始字节(默认)、base64 编码的 String 或 base64-url-safe-encoded String 或十六进制编码的字符串。

TINYBLOB

BYTES 或 STRING

N/A
根据 binary.handling.mode 连接器配置属性设置,一个原始字节(默认)、base64 编码的 String 或 base64-url-safe-encoded String 或十六进制编码的字符串。

TINYTEXT

字符串

不适用

BLOB

BYTES 或 STRING

N/A
根据 binary.handling.mode 连接器配置属性设置,一个原始字节(默认)、base64 编码的 String 或 base64-url-safe-encoded String 或十六进制编码的字符串。
仅支持大小为 2GB 的值。建议您使用声明检查模式外部化大列值。

TEXT

字符串

N/A
只支持大小为 2GB 的值。建议您使用声明检查模式外部化大列值。

MIUMBLOB

BYTES 或 STRING

N/A
根据 binary.handling.mode 连接器配置属性设置,一个原始字节(默认)、base64 编码的 String 或 base64-url-safe-encoded String 或十六进制编码的字符串。

中型

字符串

不适用

LONGBLOB

BYTES 或 STRING

N/A
根据 binary.handling.mode 连接器配置属性设置,一个原始字节(默认)、base64 编码的 String 或 base64-url-safe-encoded String 或十六进制编码的字符串。
仅支持大小为 2GB 的值。建议您使用声明检查模式外部化大列值。

LONGTEXT

字符串

N/A
只支持大小为 2GB 的值。建议您使用声明检查模式外部化大列值。

JSON

字符串

io.debezium.data.Json
包含 JSON 文档、数组或 scalar 的字符串表示。

ENUM

字符串

io.debezium.data.Enum
允许的 schema 参数包含以逗号分隔的值列表。

SET

字符串

io.debezium.data.EnumSet
允许的 schema 参数包含以逗号分隔的值列表。

YEAR[(2|4)]

INT32

io.debezium.time.Year

TIMESTAMP[(M)]

字符串

io.debezium.time.ZonedTimestamp
in ISO 8601 格式带有 microsecond 精度。MySQL 允许 M 在 0-6 范围内。

时序类型

排除 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 字段值可以正确捕获。

表 5.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 设置。

表 5.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
表 5.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
表 5.17. 当 decimal.handling.mode=double时映射
MySQL 类型字面类型语义类型

NUMERIC[(M[,D])]

FLOAT64

不适用

DECIMAL[(M[,D])]

FLOAT64

不适用

decimal.handling.mode=string
表 5.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
  • 注意:当快照执行 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

空间类型

目前,Debezium MySQL 连接器支持以下空间数据类型:

表 5.19. 空间类型映射的描述
MySQL 类型字面类型语义类型

GEOMETRY,
行STRING,
POLYGON,
MULTIPOINT,
MULTILINESTRING,
MULTIPOLYGON,
GEOMETRYCOLLECTION

STRUCT

io.debezium.data.geometry.Geometry
包含有两个字段的结构:

  • Srid (INT32: spatial reference system ID,用于定义存储在结构中的 geometry 对象的类型
  • wkb (BYTES) :以 Well-Known-Binary (wkb)格式编码的 geometry 对象的二进制表示。如需了解更多详细信息,请参阅 Open Geospatial Consortium。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部