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, BOOL | BOOLEAN | n/a |
| BIT(1) | BOOLEAN | n/a |
| BIT(>1) | BYTES | io.debezium.data.Bits长度模式参数包含一个表示位数的整数。 byte[] 包含小尾数形式的位,并调整大小以包含指定的位数。例如,其中 n 是位:字节数 = n/8 + (n%8== 0 ? 0 : 1) |
| TINYINT | INT16 | n/a |
| SMALLINT[(M)] | INT16 | n/a |
| MEDIUMINT[(M)] | INT32 | n/a |
| INT, INTEGER[(M)] | INT32 | n/a |
| BIGINT[(M)] | INT64 | n/a |
| REAL[(M,D)] | FLOAT32 | n/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)] | FLOAT64 | n/a |
| CHAR(M)] | STRING | n/a |
| VARCHAR(M)] | STRING | n/a |
| BINARY(M)] | BYTES or STRING | n/a 原始字节(默认)、base64 编码的字符串、base64-url-safe-encoded 的字符串或十六进制编码的字符串,具体取决于 binary.handling.mode 连接器配置属性设置。 |
| VARBINARY(M)] | BYTES or STRING | n/a 原始字节(默认)、base64 编码的字符串、base64-url-safe-encoded 的字符串或十六进制编码的字符串,具体取决于 binary.handling.mode 连接器配置属性设置。 |
| TINYBLOB | BYTES or STRING | n/a 原始字节(默认)、base64 编码的字符串、base64-url-safe-encoded 的字符串或十六进制编码的字符串,具体取决于 binary.handling.mode 连接器配置属性设置。 |
| TINYTEXT | STRING | n/a |
| BLOB | BYTES or STRING | n/a 原始字节(默认)、base64 编码的字符串、base64-url-safe-encoded 的字符串或十六进制编码的字符串,具体取决于 binary.handling.mode 连接器配置属性设置。仅支持大小最大为 2GB 的值。建议使用声明检查模式外部化大列值。 |
| TEXT | STRING | n/a 仅支持大小最大为 2GB 的值。建议使用声明检查模式外部化大列值。 |
| MEDIUMBLOB | BYTES or STRING | n/a 原始字节(默认)、base64 编码的字符串、base64-url-safe-encoded 的字符串或十六进制编码的字符串,具体取决于 binary.handling.mode 连接器配置属性设置。 |
| MEDIUMTEXT | STRING | n/a |
| LONGBLOB | BYTES or STRING | n/a 原始字节(默认)、base64 编码的字符串、base64-url-safe-encoded 的字符串或十六进制编码的字符串,具体取决于 binary.handling.mode 连接器配置属性设置。仅支持大小最大为 2GB 的值。建议使用声明检查模式外部化大列值。 |
| LONGTEXT | STRING | n/a 仅支持大小最大为 2GB 的值。建议使用声明检查模式外部化大列值。 |
| JSON | STRING | io.debezium.data.Json包含 JSON 文档、数组或标量的字符串表示形式。 |
| ENUM | STRING | io.debezium.data.Enum允许的架构参数包含以逗号分隔的允许值列表。 |
| SET | STRING | io.debezium.data.EnumSet允许的架构参数包含以逗号分隔的允许值列表。 |
| YEAR[(2 | 4)] | INT32 |
| TIMESTAMP[(M)] | STRING | io.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 | 文字类型 | 语义类型 |
|---|---|---|
| DATE | INT32 | io.debezium.time.Date表示自纪元以来的天数。 |
| 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 表示经过纪元的毫秒数,不包括时区信息。 |
| DATETIME(4), DATETIME(5), DATETIME(6) | INT64 | io.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 | 文字类型 | 语义类型 |
|---|---|---|
| DATE | INT32 | org.apache.kafka.connect.data.Date 表示自纪元以来的天数。 |
| TIME[(M)] | INT64 | org.apache.kafka.connect.data.Time 表示自午夜以来的时间值(以微秒为单位),不包含时区信息。 |
| DATETIME[(M)] | INT64 | org.apache.kafka.connect.data.Timestamp 表示自纪元以来的毫秒数,不包含时区信息。 |
三、Decimal类型
Debezium 连接器根据decimal.handling.mode 连接器配置属性的设置处理小数。
decimal.handling.mode=precise
表 16.decimal.handling.mode=precise 时的映射
| MySQL type | 文字类型 | 语义类型 |
|---|---|---|
| NUMERIC[(M[,D])] | BYTES | org.apache.kafka.connect.data.Decimal 比例模式参数包含一个整数,表示小数点移动了多少位。 |
| DECIMAL[(M[,D])] | BYTES | org.apache.kafka.connect.data.Decimal 比例模式参数包含一个整数,表示小数点移动了多少位。 |
decimal.handling.mode=double
表 17.decimal.handling.mode=double 时的映射
| MySQL type | 文字类型 | 语义类型 |
|---|---|---|
| NUMERIC[(M[,D])] | FLOAT64 | n/a |
| DECIMAL[(M[,D])] | FLOAT64 | n/a |
decimal.handling.mode=string
表 18.decimal.handling.mode=string 时的映射
| MySQL type | 文字类型 | 语义类型 |
|---|---|---|
| NUMERIC[(M[,D])] | STRING | n/a |
| DECIMAL[(M[,D])] | STRING | n/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, GEOMETRYCOLLECTION | STRUCT | io.debezium.data.geometry.Geometry包含一个具有两个字段的结构:srid(INT32:空间参考系统ID,定义结构体中存储的几何对象的类型,wkb (BYTES):以众所周知的二进制 (wkb) 格式编码的几何对象的二进制表示形式。 |
六、Debezium技术总结
更多Debezium技术请参考:
- Debezium技术专栏
相关文章:
Debezium日常分享系列之:Debezium2.5稳定版本之数据类型映射
Debezium日常分享系列之:Debezium2.5稳定版本之数据类型映射 一、基本类型二、时间类型三、Decimal类型四、Boolean values布尔值五、Spatial types空间类型六、Debezium技术总结 Debezium MySQL 连接器表示对带有事件的行的更改,这些事件的结构类似于该…...
通过JWT完成token登录验证
前言 什么是JWT? 全称是JSON Web token,是用于对应用程序上的用户进行身份验证的标记,使用 JWTS 的应用程序不再需要保存有关其用户的 cookie 或其他session数据 使用JWT的优势 提高了程序的可伸缩性,也极大的提高了应用程序的安全…...
【漏洞复现】福建科立迅通信指挥调度平台down_file.php sql注入漏洞
漏洞描述 福建科立迅通信调度平台 20240318 以及之前版本存在一个严重漏洞,影响了文件 api/client/down_file.php 的一个未知功能。攻击者可以通过操纵参数 uuid 发起 SQL 注入攻击。攻击者可以远程发起攻击。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守…...
软考79-上午题-【面向对象技术3-设计模式】-结构型设计模式02
一、组合模式 1-1、意图 将对象组合成树型结构,以表示"部分-整体"的层次结构。Composite使得用户对单个对象和组 合对象的使用具有一致性。 示例:对象:文件、文件夹 1-2、结构 Component 为组合中的对象声明接口;在适…...
前端面试拼图-知识广度
摘要:最近,看了下慕课2周刷完n道面试题,记录并添加部分可参考的文档,如下... 1. 移动端H5 click有300ms延迟, 如何解决? 背景:double tap to zoom 移动端H5中的300ms点击延迟问题通常是由浏览…...
Android 开发 地图 polygon 显示信息
问题 Android 开发 地图 polygon 显示信息 详细问题 笔者进行Android项目开发,接入高德地图绘制区域后,需要在指定区域(位置)内显示文本信息,如何实现 实现效果 解决方案 代码 import com.amap.api.maps.model.T…...
flink1.18.0报错 an implicit exists from scala.Int => java.lang.Integer, but
完整报错 type mismatch;found : Int(100)required: Object Note: an implicit exists from scala.Int > java.lang.Integer, but methods inherited from Object are rendered ambiguous. This is to avoid a blanket implicit which would convert any scala.Int to a…...
掌握C语言结构体,开启编程新世界
✨✨欢迎👍👍点赞☕️☕️收藏✍✍评论 个人主页:秋邱博客 所属栏目:C语言 (感谢您的光临,您的光临蓬荜生辉) 前言 前面我们也涉及到了结构体的讲解,但是只是粗略的讲了一下。 接下…...
YOLOv3学习
YOLOv3仅使用卷积层,使其成为一个全卷积网络(FCN)。文章中,作者提出一个新的特征提取网络,Darknet-53。正如其名,它包含53个卷积层,每个后面跟随着batch normalization层和leaky ReLU层。没有池…...
oracle实现批量插入
一、Dao层(增加Parm参数) void insert(Param("list") List<TicketInfo> ticketInfos); 二、Mapper层(加入条件判断值是否为空) insert all<foreach collection"list" item"item" index"index">into 表名<trim prefix…...
游戏客户端开发
1、LOL里面用到的是什么同步机制? 2、网络不好的情况下人物会出现瞬移等情况,怎样避免? 3、游戏里面有没有涉及数据存储,如存档之类的?、 4、如果让你设计存档,会如何着手? 5、以二进制方式…...
电商API接口苏宁易购获得suning商品详情页实时数据API请求接入演示
要接入苏宁易购的API接口获取商品详情页实时数据,你需要遵循以下步骤: 注册成为开放平台的开发者,获取ApiKey和ApiSecret。 使用ApiKey和ApiSecret获取访问令牌(AccessToken)。 使用AccessToken调用苏宁易购的API接口…...
数据类型转换篇(二)
文章目录 7.11 float()7.12 hex()7.13 int()7.14 list()7.15 oct()7.16 ord()7.17 repr()7.18 set()7.19 str()7.20 tuple() 7.11 float() float() 是 Python 的内置函数,用于将一个数值或数值表示的字符串转换成浮点数(floating point numberÿ…...
新零售SaaS架构:线上商城系统架构设计
零售商家为什么要建设线上商城? 传统的实体门店服务范围有限,只能吸引周边500米以内的消费者。因此,如何拓展服务范围,吸引更多的消费者到店,成为了店家迫切需要解决的问题。 缺乏忠实顾客,客户基础不稳&a…...
Word文档密码设置:Python设置、更改及移除Word文档密码
给Word文档设置打开密码是常见的Word文档加密方式。为Word文档设置打开密码后,在打开该文档时,需要输入密码才能预览及编辑,为Word文档中的信息提供了有力的安全保障。如果我们需要对大量的Word文档进行加密、解密处理,Python是一…...
jar读取目录配置、打包jar后无法获取目录下的配置
jar读取目录配置、打包jar后无法获取目录下的配置 jar读取目录配置、打包jar后无法获取目录下的配置。java打成jar包后获取不到配置文件路径。解决项目打成jar包上线无法读取配置文件。打包jar后无法读取resource下的配置文件 场景 需要读取 src/main/resources/mapper下的所…...
python第三次项目作业
打印课堂上图案 判断一个数是否是质数(素数) 设计一个程序,完成(英雄)商品的购买(界面就是第一天打印的界面) 展示商品信息(折扣)->输入商品价格->输入购买数量->提示付款 输入付款金额->打印购买小票&a…...
架构之安全性维度
流程安全性 安全基本原则:可用性 完整性 机密性 CIA 安全框架:zachman P2DR Sabsa IPDRR IATF 安全评估方法:安全测试: SAST静态测试、 IAST交互测试 安全扫描 危险模型:攻击树分析 DREAD风险评估 渗透测试:…...
odoo字段访问控制
在 Odoo 中,可以通过几种方式实现字段的访问控制,包括通过模型安全规则、记录规则和字段属性来限制字段的访问。 1. 使用模型安全规则 模型安全规则(也称为访问控制列表,ACLs)允许你定义哪些用户组可以对哪些模型进行…...
mysql的基本知识点-操作数据库表
创建数据库: CREATE DATABASE database_name;创建一个名字为database_name的数据库; 删除数据库: DROP DATABASE database_name;删除名字为database_name的数据库; 在执行删除数据库操作前,请确保你确实想要删除数据…...
Kubernetes Pod 日志持久化方案
Kubernetes Pod日志持久化方案解析 在云原生架构中,Kubernetes已成为容器编排的事实标准,但Pod的默认日志管理方式存在易丢失、难追溯的问题。日志作为故障排查、性能分析的重要依据,其持久化存储成为企业级应用的关键需求。本文将深入探讨几…...
【反蒸馏实战 04】前端开发工程师:当AI 5秒生成一个页面,你的价值在哪里?@初级前端从“切图仔”到“用户体验工程师”实战指南
摘要:2026年,AI已能5秒生成前端页面,60%的前端代码由AI产出,初级前端面临“100:1”的求职竞争。本文结合State of JS 2025、O’Reilly性能工程报告等权威数据,拆解AI对前端的冲击全景,提出“思维-能力-工作流”三级反替代模型。通过3个核心实操模块(AI生成代码审计、Cor…...
C语言期末突击:手把手教你搞定吉林大学计算机系高频考题(附完整代码)
C语言期末突击:吉林大学计算机系高频考题深度解析与实战指南 期末考试临近,对于吉林大学计算机系的同学们来说,C语言程序设计无疑是重点科目之一。面对复杂的指针操作、链表处理和递归算法,很多同学感到无从下手。本文将从历年高频…...
Cursor AI Pro智能激活四重奏:自动化工具的革命性实践指南
Cursor AI Pro智能激活四重奏:自动化工具的革命性实践指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your…...
Android集成chineseocr_lite实战:4.7M超轻量级中文OCR完整指南
Android集成chineseocr_lite实战:4.7M超轻量级中文OCR完整指南 【免费下载链接】chineseocr_lite 超轻量级中文ocr,支持竖排文字识别, 支持ncnn、mnn、tnn推理 ( dbnet(1.8M) crnn(2.5M) anglenet(378KB)) 总模型仅4.7M 项目地址: https://gitcode.…...
用OllyDbg和Cheat Engine“透视”Windows扫雷:从内存布局到游戏修改的完整实战
逆向工程实战:用OllyDbg和Cheat Engine解密Windows扫雷 当经典扫雷游戏遇上逆向工程工具,一场关于内存布局与程序逻辑的侦探游戏就此展开。本文将带你从零开始,通过OllyDbg和Cheat Engine这两款神器,逐步揭开扫雷程序背后的数据结…...
ComfyUI ControlNet Aux预处理器:三步轻松搞定AI图像精准控制 [特殊字符]
ComfyUI ControlNet Aux预处理器:三步轻松搞定AI图像精准控制 🎨 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI生成的图…...
终极网盘直链下载助手:如何一键破解八大网盘限速?
终极网盘直链下载助手:如何一键破解八大网盘限速? 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘…...
Qwen2.5-VL-7B-Instruct部署教程:GPU算力监控(nvidia-smi)+服务健康检查脚本
Qwen2.5-VL-7B-Instruct部署教程:GPU算力监控(nvidia-smi)服务健康检查脚本 1. 项目概述 Qwen2.5-VL-7B-Instruct是一款强大的多模态视觉-语言模型,能够同时处理图像和文本输入,生成高质量的响应。该模型特别适合需要…...
【51单片机实战】PWM调速、AD/DA转换与红外遥控的综合应用设计
1. PWM调速在51单片机中的实战应用 PWM(脉冲宽度调制)是控制直流电机速度最常用的方法之一。我第一次用51单片机做电机控制时,发现PWM真是个神奇的东西 - 它能让电机乖乖听话,想快就快,想慢就慢。简单来说,…...
