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


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

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

连接器可以将 MySQL 数据类型映射到 literalsemantic 类型。

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

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

以下部分详情:

基本类型

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

Expand
表 6.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)]

FLOAT32FLOAT64

精度仅用于确定存储大小。精度 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)]

BYTESSTRING

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

VARBINARY (M)]

BYTESSTRING

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

TINYBLOB

BYTESSTRING

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

TINYTEXT

字符串

不适用

BLOB

BYTESSTRING

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

TEXT

字符串

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

MIUMBLOB

BYTESSTRING

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

中型

字符串

不适用

LONGBLOB

BYTESSTRING

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 允许 M0-6 范围内。

时序类型

排除 TIMESTAMP 数据类型,MySQL temporal 类型取决于 time.precision.mode 连接器配置属性的值。对于 TIMESTAMP 列,它的默认值被指定为 CURRENT_TIMESTAMPNOW,值 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.00000023: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 允许 M0-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 来获取表定义,该定义为 BOOLEANTINYINT (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
    Copy to Clipboard Toggle word wrap
  • 注意:当快照执行 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
    Copy to Clipboard Toggle word wrap

空间类型

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

Expand
表 6.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 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

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

Theme

© 2025 Red Hat