Debezium日常分享系列之:Debezium2.5稳定版本之数据类型映射

Debezium日常分享系列之:Debezium2.5稳定版本之数据类型映射

  • 一、基本类型
  • 二、时间类型
  • 三、Decimal类型
  • 四、Boolean values布尔值
  • 五、Spatial types空间类型
  • 六、Debezium技术总结

Debezium MySQL 连接器表示对带有事件的行的更改,这些事件的结构类似于该行所在的表。该事件包含每个列值的字段。该列的 MySQL 数据类型决定 Debezium 如何表示事件中的值。

MySQL 中使用字符集和排序规则定义存储字符串的列。 MySQL 连接器在读取二进制日志事件中列值的二进制表示形式时使用列的字符集。

连接器可以将 MySQL 数据类型映射到文字类型和语义类型。

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

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

一、基本类型

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

表 13. 基本类型映射的描述

MySQL type文字类型语义类型
BOOLEAN, BOOLBOOLEANn/a
BIT(1)BOOLEANn/a
BIT(>1)BYTESio.debezium.data.Bits长度模式参数包含一个表示位数的整数。 byte[] 包含小尾数形式的位,并调整大小以包含指定的位数。例如,其中 n 是位:字节数 = n/8 + (n%8== 0 ? 0 : 1)
TINYINTINT16n/a
SMALLINT[(M)]INT16n/a
MEDIUMINT[(M)]INT32n/a
INT, INTEGER[(M)]INT32n/a
BIGINT[(M)]INT64n/a
REAL[(M,D)]FLOAT32n/a
FLOAT[§]FLOAT32 or FLOAT64精度仅用于确定存储大小。从 0 到 23 的精度 P 会生成 4 字节单精度 FLOAT32 列。从 24 到 53 的精度 P 会生成 8 字节双精度 FLOAT64 列。
FLOAT(M,D)FLOAT64从 MySQL 8.0.17 开始,非标准 FLOAT(M,D) 和 DOUBLE(M,D) 语法已被弃用,并且应该期望在 MySQL 的未来版本中删除对其的支持,将 FLOAT64 设置为默认值。
DOUBLE[(M,D)]FLOAT64n/a
CHAR(M)]STRINGn/a
VARCHAR(M)]STRINGn/a
BINARY(M)]BYTES or STRINGn/a 原始字节(默认)、base64 编码的字符串、base64-url-safe-encoded 的字符串或十六进制编码的字符串,具体取决于 binary.handling.mode 连接器配置属性设置。
VARBINARY(M)]BYTES or STRINGn/a 原始字节(默认)、base64 编码的字符串、base64-url-safe-encoded 的字符串或十六进制编码的字符串,具体取决于 binary.handling.mode 连接器配置属性设置。
TINYBLOBBYTES or STRINGn/a 原始字节(默认)、base64 编码的字符串、base64-url-safe-encoded 的字符串或十六进制编码的字符串,具体取决于 binary.handling.mode 连接器配置属性设置。
TINYTEXTSTRINGn/a
BLOBBYTES or STRINGn/a 原始字节(默认)、base64 编码的字符串、base64-url-safe-encoded 的字符串或十六进制编码的字符串,具体取决于 binary.handling.mode 连接器配置属性设置。仅支持大小最大为 2GB 的值。建议使用声明检查模式外部化大列值。
TEXTSTRINGn/a 仅支持大小最大为 2GB 的值。建议使用声明检查模式外部化大列值。
MEDIUMBLOBBYTES or STRINGn/a 原始字节(默认)、base64 编码的字符串、base64-url-safe-encoded 的字符串或十六进制编码的字符串,具体取决于 binary.handling.mode 连接器配置属性设置。
MEDIUMTEXTSTRINGn/a
LONGBLOBBYTES or STRINGn/a 原始字节(默认)、base64 编码的字符串、base64-url-safe-encoded 的字符串或十六进制编码的字符串,具体取决于 binary.handling.mode 连接器配置属性设置。仅支持大小最大为 2GB 的值。建议使用声明检查模式外部化大列值。
LONGTEXTSTRINGn/a 仅支持大小最大为 2GB 的值。建议使用声明检查模式外部化大列值。
JSONSTRINGio.debezium.data.Json包含 JSON 文档、数组或标量的字符串表示形式。
ENUMSTRINGio.debezium.data.Enum允许的架构参数包含以逗号分隔的允许值列表。
SETSTRINGio.debezium.data.EnumSet允许的架构参数包含以逗号分隔的允许值列表。
YEAR[(24)]INT32
TIMESTAMP[(M)]STRINGio.debezium.time.ZonedTimestamp采用 ISO 8601 格式,精度为微秒。 MySQL允许M的范围是0-6。

二、时间类型

除 TIMESTAMP 数据类型外,MySQL 时间类型取决于 time. precision.mode 连接器配置属性的值。对于默认值指定为 CURRENT_TIMESTAMP 或 NOW 的 TIMESTAMP 列,值 1970-01-01 00:00:00 将用作 Kafka Connect 架构中的默认值。

MySQL 允许 DATE、DATETIME 和 TIMESTAMP 列使用零值,因为有时零值优于空值。当列定义允许空值时,MySQL 连接器将零值表示为空值;当列定义不允许空值时,MySQL 连接器将零值表示为纪元日。

没有时区的时间值

DATETIME 类型表示本地日期和时间,例如“2018-01-13 09:48:27”。如您所见,没有时区信息。此类列将使用 UTC 根据列的精度转换为纪元毫秒或微秒。 TIMESTAMP 类型表示没有时区信息的时间戳。写入时,MySQL 将其从服务器(或会话)的当前时区转换为 UTC;读回该值时,MySQL 将其从 UTC 转换为服务器(或会话)的当前时区。例如:

  • 值为 2018-06-20 06:37:03 的 DATETIME 变为 1529476623000。
  • 值为 2018-06-20 06:37:03 的 TIMESTAMP 变为 2018-06-20T13:37:03Z。

此类列将根据服务器(或会话的)当前时区转换为 UTC 格式的等效 io.debezium.time.ZonedTimestamp。默认情况下将从服务器查询时区。如果失败,则必须通过数据库连接TimeZone MySQL 配置选项显式指定。例如,如果数据库的时区(全局时区或通过 connectionTimeZone 选项为连接器配置)为“America/Los_Angeles”,则 TIMESTAMP 值“2018-06-20 06:37:03”由 ZonedTimestamp 表示值为“2018-06-20T13:37:03Z”。

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

time.precision.mode=adaptive_time_microseconds(default)

  • MySQL 连接器根据列的数据类型定义确定文字类型和语义类型,以便事件准确表示数据库中的值。所有时间字段均以微秒为单位。只能正确捕获 00:00:00.000000 到 23:59:59.999999 范围内的正 TIME 字段值。

表 14. time. precision.mode=adaptive_time_microseconds 时的映射

MySQL type文字类型语义类型
DATEINT32io.debezium.time.Date表示自纪元以来的天数。
TIME[(M)]INT64io.debezium.time.MicroTime表示以微秒为单位的时间值,不包含时区信息。 MySQL允许M的范围是0-6。
DATETIME, DATETIME(0), DATETIME(1), DATETIME(2), DATETIME(3)INT64io.debezium.time.Timestamp 表示经过纪元的毫秒数,不包括时区信息。
DATETIME(4), DATETIME(5), DATETIME(6)INT64io.debezium.time.MicroTimestamp 表示经过纪元的微秒数,不包括时区信息。

time.precision.mode=connect

MySQL 连接器使用定义的 Kafka Connect 逻辑类型。此方法的精确度低于默认方法,并且如果数据库列的小数秒精度值大于 3,则事件的精确度可能会降低。只有在00:00:00.000 到 23:59:59.999 范围内的值可以被处理。仅当您可以确保表中的 TIME 值永远不会超出支持的范围时,才设置 time. precision.mode=connect。connect设置预计将在 Debezium 的未来版本中删除。

表 15. time. precision.mode=connect 时的映射

MySQL type文字类型语义类型
DATEINT32org.apache.kafka.connect.data.Date 表示自纪元以来的天数。
TIME[(M)]INT64org.apache.kafka.connect.data.Time 表示自午夜以来的时间值(以微秒为单位),不包含时区信息。
DATETIME[(M)]INT64org.apache.kafka.connect.data.Timestamp 表示自纪元以来的毫秒数,不包含时区信息。

三、Decimal类型

Debezium 连接器根据decimal.handling.mode 连接器配置属性的设置处理小数。

decimal.handling.mode=precise

表 16.decimal.handling.mode=precise 时的映射

MySQL type文字类型语义类型
NUMERIC[(M[,D])]BYTESorg.apache.kafka.connect.data.Decimal 比例模式参数包含一个整数,表示小数点移动了多少位。
DECIMAL[(M[,D])]BYTESorg.apache.kafka.connect.data.Decimal 比例模式参数包含一个整数,表示小数点移动了多少位。

decimal.handling.mode=double

表 17.decimal.handling.mode=double 时的映射

MySQL type文字类型语义类型
NUMERIC[(M[,D])]FLOAT64n/a
DECIMAL[(M[,D])]FLOAT64n/a

decimal.handling.mode=string

表 18.decimal.handling.mode=string 时的映射

MySQL type文字类型语义类型
NUMERIC[(M[,D])]STRINGn/a
DECIMAL[(M[,D])]STRINGn/a

四、Boolean values布尔值

MySQL 在内部以特定方式处理 BOOLEAN 值。 BOOLEAN 列在内部映射到 TINYINT(1) 数据类型。当表在流式传输期间创建时,它会使用正确的 BOOLEAN 映射,因为 Debezium 接收原始 DDL。在快照期间,Debezium 执行 SHOW CREATE TABLE 来获取为 BOOLEAN 和 TINYINT(1) 列返回 TINYINT(1) 的表定义。 Debezium 无法获取原始类型映射,因此映射到 TINYINT(1)。

为了使您能够将源列转换为布尔数据类型,Debezium 提供了一个 TinyIntOneToBooleanConverter 自定义转换器,您可以通过以下方式之一使用它:

  • 将所有 TINYINT(1) 或 TINYINT(1) UNSIGNED 列映射到 BOOLEAN 类型。
  • 使用逗号分隔的正则表达式列表枚举列的子集。

要使用这种类型的转换,您必须使用选择器参数设置转换器配置属性,如以下示例所示:

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 并指定需要转换为选择器属性的列,而不是根据类型转换所有列,如下例所示:
converters=boolean
boolean.type=io.debezium.connector.mysql.converters.TinyIntOneToBooleanConverter
boolean.length.checker=false
boolean.selector=db1.table1.*, db1.table2.column1

五、Spatial types空间类型

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

表 19. 空间类型映射的描述

MySQL type文字类型语义类型
GEOMETRY, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTIONSTRUCTio.debezium.data.geometry.Geometry包含一个具有两个字段的结构:srid(INT32:空间参考系统ID,定义结构体中存储的几何对象的类型,wkb (BYTES):以众所周知的二进制 (wkb) 格式编码的几何对象的二进制表示形式。

六、Debezium技术总结

更多Debezium技术请参考:

  • Debezium技术专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库存储引擎MyISAM与InnoDB

前言 MySQL存储引擎是MySQL数据库中负责管理数据存储和检索的组件,不同的存储引擎提供了不同的功能和特性,可以根据实际需求选择合适的存储引擎来优化数据库性能和功能。以下是一些常见的MySQL存储引擎:InnoDB、MyISAM、MEMORY、NDB Cluster…

【LeetCode】--- 动态规划 集训(一)

目录 一、1137. 第 N 个泰波那契数1.1 题目解析1.2 状态转移方程1.3 解题代码 二、面试题 08.01. 三步问题2.1 题目解析2.2 状态转移方程2.3 解题代码 三、746. 使用最小花费爬楼梯3.1 题目解析3.2 状态转移方程3.3 解题代码 一、1137. 第 N 个泰波那契数 题目地址&#xff1a…

苏州城市学院芮国强一行莅临聚合数据走访调研

3月19日,苏州城市学院校党委书记芮国强、校长赵志宏一行莅临聚合数据,就数据科技赋能行业升级展开调研。聚合数据董事长左磊接待来访。 城市学院党委理论学习中心组一行参观了聚合数据展厅,了解了聚合数据的发展历程、数据产品、应用案例、奖…

QT信号和槽机制connect用法

信号与槽机制是绝对不可或缺且常用的&#xff0c;其中的参数一般都会比较简单&#xff0c;bool、int、QString之类的&#xff0c;但当我们想要传递相对比较复杂的参数&#xff0c;例如QVector<int>、QList<QString>&#xff0c;以及一些我们自定义的结构体时&#…

常用的6个的ChatGPT网站,国内可用!

GPTGod &#x1f310; 链接&#xff1a; GPTGod &#x1f3f7;️ 标签&#xff1a; GPT-4 免费体验 支持API 支持绘图 付费选项 &#x1f4dd; 简介&#xff1a;GPTGod 是一个功能全面的平台&#xff0c;提供GPT-4的强大功能&#xff0c;包括API接入和绘图支持。用户可以选择免…

【WPF应用5】WPF中的TextBlock控件:属性与事件详解及示例

在WPF&#xff08;Windows Presentation Foundation&#xff09;开发中&#xff0c;TextBlock控件是一个常用的元素&#xff0c;用于显示静态或动态文本内容。它提供了丰富的属性和事件&#xff0c;使得开发者能够灵活地控制文本的显示样式和响应用户的交互行为。本文将详细介绍…

数理最适化笔记1

1.1数理最适化是什么&#xff1f; 实际的问题通过数学公式表达出来&#xff0c;并且找到最优解的一种方叫做数理最适化。 数理最适化问题通常是 目的函数&#xff0c;和制约条件组成。 数理最适化问题有很多&#xff0c;最基本的叫做 线性最适化问题 eg. minimize 3x4y s.…

深入BEV感知中的魔鬼细节:综述、评估和秘诀

深入BEV感知中的魔鬼细节&#xff1a;综述、评估和秘诀 论文链接&#xff1a;https://arxiv.org/pdf/2209.05324.pdf 学习感知任务的鸟瞰图&#xff08;BEV&#xff09;中的强大表示法是一种趋势&#xff0c;并引起了工业界和学术界的广泛关注。大多数自动驾驶常规方法是在前…

【那些年错过的好书】——TypeScript+Vue.js前端开发从入门到精通

喜欢前端的同学&#xff0c;可以私信我加入学习群&#xff0c;或关注公众号——【前端系列教程】 正文开始 前言推荐理由作者简介书籍特点章节介绍实书示例写在最后 前言 陌生的朋友&#xff0c;你是否曾为前途而迷茫&#xff0c;看不到努力的价值&#xff0c;时常感到焦虑………

一些常用的Python小技巧

python小技巧 使用列表推导式&#xff1a;列表推导式是一种简洁的方式生成新的列表。例如&#xff0c;可以使用列表推导式快速生成一个递增的数字列表&#xff1a;numbers [x for x in range(10)]。 使用enumerate()函数&#xff1a;enumerate()函数用于在迭代过程中同时获取…

linux系统kubernetes的deployment使用

deployment deployment概念示例文件说明deployment可用字段服务暴露 deployment 概念 deployment 》deploy //可以简写kubectl create deployment myweb --imagenginx --dry-run -o yaml > nginx.yaml 创建文件kubectl expose deployment myweb --nameweb-svc --port8…

MySQL中Buffer pool、Log Buffer和redo、undo日志介绍

MySQL中Buffer pool、Log Buffer和redo、undo日志介绍 Buffer Pool 原理MySQL中的内存结构Buffer PoolChange BufferLog Buffer redo和undo日志redo日志为什么需要REDO日志redo log 基本概念redo的组成redo的整体流程redo log的刷盘策略 undo 日志undo log 基本概念undo log的作…

Qt 不同数据类型转换

一.不同类型数据转换示例&#xff1a; #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QJsonDocument> #include <QJsonObject> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication::setAttribute…

使用Python的smtplib和email模块实现邮件收发功能

&#x1f4e7; 使用Python的smtplib和email模块实现邮件收发功能 在Python中&#xff0c;smtplib和email模块是处理电子邮件的强大工具。本文将通过多个案例代码&#xff0c;详细介绍如何使用这两个模块来发送和接收电子邮件。&#x1f680; &#x1f528; 环境准备 在开始之…

别踩坑!2024年小红书代写代发机构选择指南!

在小红书平台上&#xff0c;一篇优质的内容往往能迅速吸引用户的关注&#xff0c;为品牌带来不可估量的曝光和转化。然而&#xff0c;对于许多品牌来说&#xff0c;创作高质量的小红书内容并非易事。因此&#xff0c;选择一家专业的小红书代写代发机构成为了不少品牌的明智之选…

【前端Vue】社交信息头条项目完整笔记第2篇:二、登录注册,准备【附代码文档】

社交媒体-信息头条项目完整开发笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;一、项目初始化使用 Vue CLI 创建项目,加入 Git 版本管理,调整初始目录结构,导入图标素材,引入 Vant 组件库,移动端 REM 适配,关于 , 配置文件,封装请求模块。十、用户关…

线程池相关详解

1.线程池的核心参数 线程池核心参数主要参考ThreadPoolExecutor这个类的7个参数的构造函数&#xff1a; corePoolSize核心线程数目 maximumPoolSize最大线程数目&#xff08;核心线程救急线程的最大数目&#xff09; keepAliveTime生存时间:救急线程的生存时间&#xff0c;生…

【Linux中vim系列】如何在vim中检索字符串

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

1.2 编译型语言和解释型语言的区别

编译型语言和解释型语言的区别 通过高级语言编写的源码&#xff0c;我们能够轻松理解&#xff0c;但对于计算机来说&#xff0c;它只认识二进制指令&#xff0c;源码就是天书&#xff0c;根本无法识别。源码要想执行&#xff0c;必须先转换成二进制指令。 所谓二进制指令&…

elment-ui el-tabs组件 每次点击后 created方法都会执行2次

先看错误的 日志打印: 错误的代码如下: 正确的日志打印: 正确的代码如下: 前言: 在element-ui的tabs组件中,我们发现每次切换页面,所有的子组件都会重新渲染一次。当子页面需要发送数据请求并且子页面过多时,这样会过多的占用网络资源。这里我们可以使用 v-if 来进行…