惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
Cyberwarzone
Cyberwarzone
L
LINUX DO - 最新话题
N
News and Events Feed by Topic
T
Troy Hunt's Blog
Help Net Security
Help Net Security
S
Security @ Cisco Blogs
Google DeepMind News
Google DeepMind News
Security Archives - TechRepublic
Security Archives - TechRepublic
M
MIT News - Artificial intelligence
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V2EX - 技术
V2EX - 技术
Y
Y Combinator Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
Cisco Talos Blog
Cisco Talos Blog
T
Threatpost
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
SegmentFault 最新的问题
I
InfoQ
H
Hacker News: Front Page
D
Docker
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Blog — PlanetScale
Blog — PlanetScale
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
Netflix TechBlog - Medium
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
博客园 - 【当耐特】
T
Tor Project blog
U
Unit 42
H
Heimdal Security Blog
Microsoft Azure Blog
Microsoft Azure Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
P
Privacy & Cybersecurity Law Blog
PCI Perspectives
PCI Perspectives
美团技术团队
O
OpenAI News
T
Tailwind CSS Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog
GbyAI
GbyAI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
MyScale Blog
MyScale Blog

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12) Snack JSONPath 项目架构分析 Claude Code Buddy 小析:一个非核心功能,如何体现产品的细节完成度 AI新时代下的图床管理方案-Cloudflare图床+MCP+Skills方案指南 化繁为简:顺丰速运App如何通过 HarmonyOS SDK实现专业级空间测量 从零实现富文本编辑器#13-React非编辑节点的内容渲染 AI开发-python-langchain框架(3-23-OpenAI Functions风格Tool Calling智能助手) .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut PbootCMS 网站内容数量多导致访问慢?这些实用优化方案帮你提速! - 家兴网络技术工作室 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 网站漏洞怎么发现并修复?一篇实用指南(附完整流程) - 家兴网络技术工作室 开了 TUN 模式还是直连?90% 的人都踩过这个坑 Github日报|2026年04月12日 - AI一族 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术 Etsy 把 1000 个 MySQL 分片迁进 Vitess:425TB 数据背后的真正问题不是性能,而是运维规模 MicroPython LVGL基础知识和概念:底层渲染与性能优化 - FreakStudio 数据库草图算法 Python 潮流周刊#146:CPython 引入 Rust 的进展 - 豌豆花下猫 最小生成树 - mofei1116 红日靶场七:从外网入口、容器逃逸到 AD 接管的完整利用链复盘 - YouDiscovered1t 分享四款开源且实用的 Kafka 管理工具 - 追逐时光者 vLLM 权重加载机制全解析:从挑战到理想架构 LCT 学习笔记 - ACehomoxue Avalonia UI 12.0.0 正式发布:架构演进和性能飞跃 - 张善友 当 AI Agent 把调用链拉长,延迟开始成为一门生意 conhost.exe 无法显示 U+2717 - 145a 太秀了,我把自己蒸馏成了 Skill!已开源 - 程序员鱼皮 ASP.NET Core 内存缓存实战:一篇搞懂该怎么配、怎么避坑 基于 Ghostty 带有分割标签页和为 Claude 编程设计的通知终端 - BugShare AI 焊死入口:教育的“操作系统级”重塑 - 郝hai 初级Java开发工程师使用sql脚本编写代码的过程是简单而且不糊涂 - CoderOilStation Claude Code通关手册(六):MCP协议完全指南 - 暮色之狐 边框灯光环绕动画特效实现指南 - Newbe36524 开源:子木蒸馏版的 SEO 审计工具 seo-audit-skill v1.0 我所理解的Python元模型 【从0到1构建一个ClaudeAgent】规划与协调-TodoWrite - 程序员Seven Claude 和 Codex 在审计 Skill 上性能差异探究 - ACai_sec AScript如何实现中文脚本引擎 - rockey627 【渗透测试】HTB Season10 Garfield 全过程wp - dynasty_chenzi Android 开发者为什么必须掌握 AI 能力?端侧视角下的技术变革 树状数组正确性证明 - AC-wyr 你的 AI 焦虑,可能比 AI 本身更危险——ATM 机没有消灭银行柜员,但恐慌消灭了你的判断力 - 我没有三颗心脏 一个拉胯的分库分表方案有多绝望?整个部门都在救火! - 冰河团队 动态规划入门必学之走方格问题 - Ofnoname PostgREST 与 PostgreSQL 角色权限配置全解析(生产级实践) - SheepDog1998 使用 UEFI 图形输出协议 GOP 在屏幕上显示图像的方法 - 阿源- Claude Code通关手册(五):组建你的AI专家团队,子代理系统 - 暮色之狐 一个程序员到架构师的催婚路之感悟(整整10年后的催婚相亲感悟) - MisterLip 用 Agent Skill 自动生成工作周报 - 赵康
gt-checksum v4.0.0 新功能解读系列文章(2):自定义数据类型映射——异构迁移不再手工对齐
GreatSQL · 2026-06-17 · via 博客园_首页

在 Oracle → MySQL、MariaDB → MySQL、MySQL 跨版本升级等迁移场景中,源端和目标端的数据类型往往不完全一致。

过去,gt-checksum 只能依赖内置的默认映射规则,面对复杂的类型差异只能人工逐列核对。

gt-checksum v4.0.0 新增 dTypeMappingFile 参数,支持用户自定义数据类型映射规则,让异构迁移校验真正实现"规则驱动"。


一、功能简介

dTypeMappingFile 是 gt-checksum v4.0.0 在 checkObject=struct(结构校验)模式下新增的核心参数,用于指定用户自定义的数据类型映射规则文件。

参数说明

参数 默认值 说明
dTypeMappingFile 空(使用内置规则) 指定 YAML 或 JSON 格式的映射规则文件路径
--preview-dtype-mapping - CLI 参数,加载规则后输出映射预览表并退出,便于调试验证

在配置文件 gc.conf 中添加一行即可启用:

dTypeMappingFile=/path/to/dtype-mapping.yaml

支持的迁移场景

映射规则按迁移场景分组,gt-checksum 会根据源端和目标端的数据库类型及版本自动选择对应的规则组:

场景键名 适用场景 说明
oracle_to_mysql Oracle → MySQL 异构迁移 处理 NUMBER、VARCHAR2、DATE 等 Oracle 特有类型
mysql_upgrade MySQL 跨版本升级 处理 5.6/5.7 → 8.0/8.4 等版本间的类型差异
mariadb_to_mysql MariaDB → MySQL 迁移 处理 MariaDB 特有的类型别名和属性差异

二、功能作用及使用场景深入解读

2.1 为什么需要自定义数据类型映射?

在真实的迁移项目中,数据类型映射远比"一对一替换"复杂:

场景一:Oracle NUMBER 类型的多义性

Oracle 的 NUMBER 类型是一个"万能数值类型",可以表示整数、定点数、浮点数,取决于 precisionscale 的组合:

  • NUMBER(10,0) → 应映射为 BIGINT(整数)
  • NUMBER(10,2) → 应映射为 DECIMAL(10,2)(定点数)
  • NUMBER(无精度) → 应映射为 DECIMAL 或保持原样

不同业务场景对同一个 NUMBER 可能有不同的映射策略,内置规则无法覆盖所有情况。

场景二:MySQL 跨版本的类型漂移

MySQL 5.7 到 8.0 升级过程中,部分类型的默认行为发生了变化(如 utf8mb4 的默认 collation 从 utf8mb4_general_ci 变为 utf8mb4_0900_ai_ci),某些旧类型在新版本中有更合适的替代。升级校验时需要明确告诉工具"这些差异是预期的"。

场景三:MariaDB 到 MySQL 的类型别名

MariaDB 引入了一些类型别名(如 INET6UUID),这些类型在 MySQL 中并不存在。迁移到 MySQL 时,需要将 INET6 映射为 VARCHAR(39)UUID 映射为 CHAR(36) 等。虽然 gt-checksum 内置了这些基础映射,但用户可能需要更精细的控制
(如指定 nullabledefault 等属性)。

场景四:同名类型的不同属性要求

即使是同一种类型,不同列可能需要不同的属性配置。例如,迁移后的某些列要求 NOT NULL DEFAULT '',而另一些列允许 NULL。这种列级别的精细控制,需要通过自定义规则来实现。

2.2 规则文件格式

gt-checksum 支持 YAML 和 JSON 两种格式。推荐使用 YAML 格式,可读性更好。

YAML 格式结构

dTypeMapping:
  oracle_to_mysql:
    - source_type: NUMBER
      target_type: BIGINT
      condition: "p <= 19 and s = 0"
      description: "整数小于等于19位映射为BIGINT"
    - source_type: NUMBER
      target_type: DECIMAL
      description: "其余NUMBER映射为DECIMAL(p,s)"
  mariadb_to_mysql:
    - source_type: CHAR
      target_type: VARCHAR
  mysql_upgrade:
    - source_type: CHAR
      target_type: VARCHAR

顶层键固定为 dTypeMapping,下面按场景分组,每个场景包含一组规则列表。

JSON 格式

{
  "dTypeMapping": {
    "oracle_to_mysql": [
      {"source_type": "NUMBER", "target_type": "BIGINT", "condition": "p <= 19 and s = 0"}
    ]
  }
}

2.3 规则字段详解

每条规则支持以下字段:

字段 必填 类型 说明
source_type string 源端类型名(大小写不敏感),如 NUMBERVARCHAR2
target_type string 目标端类型名,可含精度,如 BIGINTDECIMAL(10,2)
condition string 条件表达式,用于精细匹配(见下文)
object string 对象级匹配模式,支持 schema.*schema.tableschema.table.column
column_pattern string 列名正则匹配,如 ^id__type$
nullable bool 覆盖目标端列的 NULL/NOT NULL 属性
unsigned bool 覆盖目标端列的 UNSIGNED 属性(仅数值类型)
autoinc bool 过滤条件:仅匹配源端列是否具有 AUTO_INCREMENT 属性
default any 覆盖目标端列的默认值
description string 规则说明(纯文档,不影响匹配逻辑)

2.4 条件表达式

condition 字段支持一个轻量级的条件表达式引擎,用于根据列的精度属性精细匹配。

支持的变量

变量 含义 示例
p 精度(Precision) NUMBER(10,2)p=10
s 小数位(Scale) NUMBER(10,2)s=2
nullable 是否允许 NULL 1 表示允许,0 表示不允许
unsigned 是否无符号 1 表示 UNSIGNED
autoinc 是否自增 1 表示 AUTO_INCREMENT

支持的运算符

  • 比较:=!=<<=>>=
  • 逻辑:and(优先级高)、or

条件表达式示例

# NUMBER 精度 <= 19 且小数位为 0 → 整数映射为 BIGINT
condition: "p <= 19 and s = 0"

# 精度 > 19 或有小数位 → 映射为 DECIMAL
condition: "p > 19 or s > 0"

# 仅匹配源端为 UNSIGNED 的列
condition: "unsigned = 1"

💡 设计要点nullableunsigneddefault覆盖属性(override),不是过滤条件。也就是说,一条规则不会因为源端列的 nullable 状态不同而不匹配——它匹配后会覆盖目标端的对应属性。如果需要按源端 unsigned 状态
过滤,应使用 condition: "unsigned = 1" 而非 unsigned: true

2.5 对象级精细匹配(object 字段)

object 字段支持三个层级的精细匹配,格式为 schema.table.column

格式 示例 匹配范围
schema.* mydb.* mydb 下所有表的所有列
schema.table mydb.orders mydb.orders 表的所有列
schema.table.column mydb.orders.order_id 精确匹配单个列

匹配过程大小写不敏感。object 可以与 conditioncolumn_pattern 组合使用,实现多维度的精细控制。

使用示例

mariadb_to_mysql:
  # 案例1:schema 级 — sbtest 下所有表的 CHAR 都映射为 VARCHAR
  - object: sbtest.*
    source_type: CHAR
    target_type: VARCHAR
    nullable: false
    default: ''

  # 案例2:表级 — 只映射 sbtest.t9 的 INT 列
  - object: sbtest.t9
    source_type: INT
    target_type: BIGINT
    unsigned: true
    autoinc: true

  # 案例3:列级 — 只映射 sbtest.t9 的 c 列
  - source_type: CHAR
    target_type: VARCHAR
    object: sbtest.t9.c
    nullable: false
    default: ''

2.6 匹配语义:First-Match

规则采用 first-match(首次匹配)语义:在规则列表中,先定义的规则优先匹配。一旦某条规则匹配成功,后续规则不再检查。

这意味着在编写规则时,更具体的规则应放在前面,更通用的兜底规则放在后面

oracle_to_mysql:
  # 具体规则在前:NUMBER 精度 <= 19 且无小数位 → BIGINT
  - source_type: NUMBER
    target_type: BIGINT
    condition: "p <= 19 and s = 0"

  # 通用规则在后:其余 NUMBER → DECIMAL
  - source_type: NUMBER
    target_type: DECIMAL

如果顺序反过来,所有 NUMBER 类型都会被第一条无条件规则匹配为 DECIMAL,后面的条件规则永远不会生效。

2.7 规则如何影响校验和修复

自定义映射规则在两个阶段发挥作用:

比较阶段(Struct Comparison)

在校验源端和目标端的表结构时,gt-checksum 会先根据映射规则将源端列的类型"翻译"为期望的目标端类型,然后再与目标端的实际类型比较。如果目标端的实际类型与映射后的期望类型一致,就认为这是一个"已知可接受的迁移转换",不标记为差异。

修复阶段(Repair SQL Generation)

当检测到结构差异需要生成修复 SQL 时,映射规则中的覆盖属性(nullableunsignedautoincdefault)会被写入 ALTER TABLE ... MODIFY COLUMN 语句中,确保修复后的列属性符合预期。


三、功能使用演示

3.1 编写映射规则文件

以 Oracle → MySQL 迁移为例,创建 dtype-mapping.yaml

dTypeMapping:
  oracle_to_mysql:
    # NUMBER 精度 <= 19 且无小数位 → BIGINT
    - source_type: NUMBER
      target_type: BIGINT
      condition: "p <= 19 and s = 0"
      description: "整数 <= 19位映射为BIGINT"

    # NUMBER 精度 <= 19 且有小数位 → DECIMAL
    - source_type: NUMBER
      target_type: DECIMAL
      condition: "s > 0"
      description: "有小数位的NUMBER映射为DECIMAL(p,s)"

    # 其余 NUMBER → DECIMAL(兜底)
    - source_type: NUMBER
      target_type: DECIMAL
      description: "其余NUMBER映射为DECIMAL"

    # VARCHAR2 → VARCHAR
    - source_type: VARCHAR2
      target_type: VARCHAR
      description: "VARCHAR2映射为VARCHAR"

    # DATE → DATETIME
    - source_type: DATE
      target_type: DATETIME
      description: "Oracle DATE包含时间,映射为DATETIME"

3.2 配置文件集成

gc.conf 中设置:

checkObject=struct
tables=srcdb.*
srcDSN=user:ENC[...]@tcp(10.0.0.1:1521)/orcl
dstDSN=user:ENC[...]@tcp(10.0.0.2:3306)/dstdb
dTypeMappingFile=./dtype-mapping.yaml

3.3 预览映射规则

使用 --preview-dtype-mapping 参数可以在正式运行前验证规则文件的解析结果:

$ gt-checksum -c gc.conf --preview-dtype-mapping

[dTypeMapping] Scenario: oracle_to_mysql (5 rules)
  No.   source_type           target_type           object                autoinc   condition                       description
  ----  --------------------  --------------------  --------------------  --------  ------------------------------  -----------
  1     NUMBER                BIGINT                (any)                 -         p <= 19 and s = 0               整数 <= 19位映射为BIGINT
  2     NUMBER                DECIMAL               (any)                 -         s > 0                           有小数位的NUMBER映射为DECIMAL(p,s)
  3     NUMBER                DECIMAL               (any)                 -         (any)                           其余NUMBER映射为DECIMAL
  4     VARCHAR2              VARCHAR               (any)                 -         (any)                           VARCHAR2映射为VARCHAR
  5     DATE                  DATETIME              (any)                 -         (any)                           Oracle DATE包含时间,映射为DATETIME

预览输出后程序直接退出,不会连接数据库或执行校验,适合在编写规则后快速验证格式和匹配逻辑。

3.4 正常运行校验

$ gt-checksum -c gc.conf

Initializing gt-checksum
Reading configuration files
Opening log files
Checking configuration options

[STRUCT] Comparing: srcdb.orders ↔ dstdb.orders
  [DIFF] srcdb.orders.created_at: source=DATE, dest=DATETIME → covered by dTypeMapping rule #5, skipped
  [OK]   srcdb.orders.order_id: source=NUMBER(19,0) → BIGINT, dest=BIGINT, matched
  [DIFF] srcdb.orders.status: source=VARCHAR2(10), dest=VARCHAR(10) → covered by dTypeMapping rule #4, skipped

[STRUCT] Comparing: srcdb.users ↔ dstdb.users
  ...

当源端列类型与目标端列类型之间的差异被映射规则覆盖时,gt-checksum 会标记为 covered by dTypeMapping rule,不计入结构差异。

3.5 MariaDB → MySQL 迁移示例

dTypeMapping:
  mariadb_to_mysql:
    # MariaDB 的 INT AUTO_INCREMENT → MySQL 的 BIGINT
    - source_type: INT
      target_type: BIGINT
      autoinc: true
      unsigned: true
      nullable: false
      description: "自增主键升级为BIGINT"

    # MariaDB 的 CHAR → MySQL 的 VARCHAR(schema 级)
    - object: mydb.*
      source_type: CHAR
      target_type: VARCHAR
      description: "CHAR统一映射为VARCHAR"

3.6 MySQL 跨版本升级示例

dTypeMapping:
  mysql_upgrade:
    # MySQL 5.6 的 INT → 8.0 的 BIGINT(仅特定表)
    - source_type: INT
      target_type: BIGINT
      object: mydb.orders
      unsigned: true
      description: "orders表的INT升级为BIGINT"

    # MySQL 5.6 的 CHAR → 8.0 的 VARCHAR
    - source_type: CHAR
      target_type: VARCHAR
      nullable: true
      description: "CHAR升级为VARCHAR"

3.7 JSON 格式示例

如果不习惯 YAML,也可以使用 JSON 格式:

{
  "dTypeMapping": {
    "oracle_to_mysql": [
      {
        "source_type": "NUMBER",
        "target_type": "BIGINT",
        "condition": "p <= 19 and s = 0",
        "description": "整数映射为BIGINT"
      },
      {
        "source_type": "NUMBER",
        "target_type": "DECIMAL",
        "description": "其余NUMBER映射为DECIMAL"
      }
    ]
  }
}

只需将文件扩展名设为 .json,gt-checksum 会自动按 JSON 格式解析。


四、最佳实践及使用约束

4.1 最佳实践

1. 先预览,再校验

编写完规则文件后,始终先用 --preview-dtype-mapping 验证:

gt-checksum -c gc.conf --preview-dtype-mapping

确认规则数量、匹配顺序和条件表达式无误后,再正式运行校验。

2. 具体规则在前,通用规则在后

由于采用 first-match 语义,必须把精确匹配的规则放在前面:

# ✅ 正确:先精确后通用
- source_type: NUMBER
  target_type: BIGINT
  condition: "p <= 19 and s = 0"
- source_type: NUMBER
  target_type: DECIMAL

# ❌ 错误:通用规则在前,后面永远不会匹配
- source_type: NUMBER
  target_type: DECIMAL
- source_type: NUMBER
  target_type: BIGINT
  condition: "p <= 19 and s = 0"

3. 善用 object 实现列级精细控制

当不同表或列需要不同的映射策略时,使用 object 字段精确指定范围:

# 只对 orders 表的 amount 列应用特殊映射
- source_type: NUMBER
  target_type: DECIMAL(20,4)
  object: mydb.orders.amount
  description: "金额列保留高精度"

4. 用 description 字段记录映射原因

description 虽然不影响匹配逻辑,但对于团队协作和后续维护至关重要:

- source_type: NUMBER
  target_type: BIGINT
  condition: "p <= 19 and s = 0"
  description: "业务层确认所有<=19位的NUMBER都是整数ID或计数器,2026-05 张三确认"

5. 区分 unsigned 过滤与覆盖

  • unsigned: true(覆盖属性):匹配成功后,强制目标端列加 UNSIGNED 属性
  • condition: "unsigned = 1"(过滤条件):只匹配源端已经是 UNSIGNED 的列
# 只匹配源端 UNSIGNED 的 TINYINT,映射为目标端带 UNSIGNED 的 SMALLINT
- source_type: TINYINT
  target_type: SMALLINT
  condition: "unsigned = 1"
  unsigned: true

6. 为 Oracle NUMBER 编写完整的规则链

Oracle 的 NUMBER 类型覆盖面广,建议至少编写三条规则:

oracle_to_mysql:
  - source_type: NUMBER
    target_type: BIGINT
    condition: "p <= 19 and s = 0"
    description: "整数"
  - source_type: NUMBER
    target_type: DECIMAL
    condition: "s > 0"
    description: "有小数位"
  - source_type: NUMBER
    target_type: DECIMAL
    description: "兜底"

4.2 使用约束

1. 仅在 checkObject=struct 模式下生效

dTypeMappingFile 仅对结构校验模式有效。在 checkObject=data(数据校验)模式下,数据类型映射不影响数据行的比对逻辑。

2. target_type 必须是合法的 MySQL 类型

gt-checksum 启动时会校验每条规则的 target_type 是否在 MySQL 类型白名单中。不合法的类型会输出告警但不会阻止运行。白名单包括:TINYINTSMALLINTMEDIUMINTINTBIGINTDECIMALFLOATDOUBLECHARVARCHARBINARYVARBINARYTEXTBLOBDATETIMEDATETIMETIMESTAMPENUMSETJSONBIT 等 30 余种类型。

3. unsignedautoinc 有类型限制

  • unsigned 覆盖属性仅适用于数值类型(TINYINT ~ NUMERIC),对非数值类型设置 unsigned 会被自动忽略并输出告警
  • autoinc 过滤条件仅对整数类型(TINYINT ~ BIGINT)有效,对非整数类型设置 autoinc 会被自动忽略

4. 规则加载失败不会阻止程序运行

如果规则文件路径不存在或格式有误,gt-checksum 会输出 WARN 级别日志但继续运行(使用内置默认映射)。建议关注启动日志中的 [WARNING] 输出。

5. 规则全局加载,启动后不可修改

映射规则在程序启动时一次性加载到全局变量 GlobalDTypeMappingRules,运行期间只读。修改规则文件后需要重启 gt-checksum 才能生效。

6. 配置一致性

映射规则应与实际迁移场景匹配。如果配置了 oracle_to_mysql 场景的规则,但实际连接的是两个 MySQL 实例,该场景的规则不会被加载(gt-checksum 会根据源端/目标端的数据库类型自动选择场景)。


五、总结

gt-checksum v4.0.0 的自定义数据类型映射功能,通过一个结构清晰的 YAML/JSON 配置文件,将异构迁移中的类型对齐工作从"人工逐列核对"升级为"规则驱动自动匹配"。

三种迁移场景(Oracle → MySQL、MySQL 跨版本升级、MariaDB → MySQL)的规则分组设计,配合 schema/table/column 三级对象匹配、条件表达式引擎、以及 nullable/unsigned/autoinc/default 属性覆盖,可以灵活应对从粗粒度到细粒度的
各种映射需求。

--preview-dtype-mapping CLI 参数让规则调试变得直观,first-match 语义让规则优先级清晰可控。

一句话总结dTypeMappingFile 让异构迁移的类型对齐,从手工活变成了配置活。


相关阅读