首批通过分布式安全可靠测评,为关键业务系统打造
Latin1 字符集乱码问题
更新时间:2026-04-14 15:36:11
背景信息
Latin1(正式名称为 ISO-8859-1)是一种 8 位字符编码标准,属于 ISO/IEC 8859 系列的一部分。Latin1 字符集的基本特性如下:
编码范围:0x00-0xFF(共 256 个字符)。
支持语言:西欧语言(包括英语、法语、德语、西班牙语、意大利语等)。
ASCII 兼容:0x00-0x7F 和 ASCII 完全一致。
Latin1 字符集出现乱码问题的原因
Latin1 字符集本身是字节编码,并不支持中文。因此迁移 Latin1 数据时,您需要知道 Latin1 中存储的是哪个字符集下的字节数组,通常是 UTF-8。使用 Latin1 字符集存储中文的操作如下:
获取中文的 UTF-8 编码的字节数组。
将该数组存储在 Latin1 字符集定义的字段中。
将字符集转换为字节数组。
将字节数组按照 UTF-8 的编码规则进行转换,获取正确的中文数据。
OMS 社区版解决方案
Source、Sink 新增两个两个参数 latin1byte 和 names,支持的数据源包括 MySQL、OceanBase 和 TiDB。
latin1byte用于设置 Latin1 的实际字符集。names用于设置是否在连接数据库时执行set names '字符集'。默认使用程序中的自动设置。OceanBase 数据源无需设置,MySQL 数据源设置为
utf8。设置
names="null"。null 为字符串,表示不设置set names。null 不设置
set names的原因:当存在是 Latin1 字符集的字段时,如果设置set names,即使使用getBytes也无法获取原始的 Latin1 字符集字节数组。其他正常字符集,设置
set names 'names 具体设置的字符集'。
读取数据
指定 Latin1 字符集实际存储的字符集,在读取时使用 getBytes,然后再使用 new String(byte,"字符集") 获取正确的字符串。
写入数据
请注意当源端和目标端的字段均是 Latin1 字符集时才生效。
全量迁移
源端读取后会以 STRING 类型存储传递给 Sink 端,Sink 端获取 Latin1 实际字符集字节数组
getBytes("latin1实际字符集"),再使用setBytes写入目标端。增量同步
增量同步组件消费 Store 数据,直接将消费到的
bytes使用setBytes写入目标端。
数据迁移任务场景配置
下文不同类型数据迁移任务场景配置的前提是基于 Latin1 实际字符集为 uft8,即源端实际存储的是 uft8 字符集数据。您需要根据实际情况,结合《OMS 社区版解决方案》模块中对于 Source 和 Sink 的配置原理进行设置。
MySQL -> OceanBase
全量迁移
全部使用默认配置,数据迁移和数据校验均正常。
增量同步
默认配置乱码:您可以在
Sink中添加latin1byte=utf8配置。反向增量
默认配置乱码:您可以在
Sink中添加latin1byte=utf8配置。
OceanBase -> MySQL
全量迁移
默认配置乱码:您可以在
Source和Sink中分别添加latin1byte=utf8配置。增量同步
默认配置乱码:您可以在
Sink中添加latin1byte=utf8配置。反向增量
默认配置乱码:您可以在
Sink中添加latin1byte=utf8配置。
TiDB -> OceanBase
全量迁移
默认配置乱码:源端 TiDB 读取时,Latin1 字符集字段默认使用
getBytes后再使用new String(bytes,utf8)。您可以在Sink中添加latin1byte=utf8配置解决乱码问题。默认配置全量校验不一致:您可以添加配置
task.sourceImageSection.latin1byte=utf8。
增量同步
默认配置乱码:您可以在
Sink中添加latin1byte=utf8配置。反向增量
默认配置乱码:您可以在
Sink中添加latin1byte=utf8配置。
OceanBase -> OceanBase
全量迁移
默认配置乱码:您可以在
Source和Sink中分别添加latin1byte=utf8配置。增量同步
默认配置乱码:您可以在
Sink中添加latin1byte=utf8配置。反向增量
默认配置乱码:您可以在
Sink中添加latin1byte=utf8配置。
旁路导入
目前旁路导入不支持写入 Latin1 字符集的数据,会报异常问题。