Oracle-TiDB迁移-生僻字乱码问题
发布网友
发布时间:2024-10-05 21:18
我来回答
共1个回答
热心网友
时间:2024-10-05 22:35
在某个业务上线的测试阶段,遇到了执行表字段收缩语句时的报错。TiDB返回错误信息为"incorrect string value '\xED' for column 'licenseno'",这通常在插入非兼容字符时发生。收缩字段的操作涉及数据从KV加载到内存,修改,验证,然后回填。推测问题可能出在数据回填阶段的合法性校验上。
经过检查,发现在"licenseno"字段,一个车牌号字段,存在非法字符,如 " F XXXXX"。怀疑TiDB可能无法正确处理某些生僻字。人工插入测试后,确认源数据无误,问题可能出在数据迁移链路上。数据最初来自Oracle库,通过sqluldr2导出CSV,再到TiDB的导入过程中出现问题。
在Oracle端,确认了原始数据正常,但在TiDB中看到的16进制编码与Oracle的不匹配,显示出编码差异。进一步验证发现,sqluldr2在导出CSV时存在生僻字转码错误,将字符“ ”误编码为“EDA193EDBE824644374D3638”,而实际应为“f0,a4,be,82,46,44,37,4d,36,38”。
了解到lighting导入CSV时,如果文件编码不匹配,可能会引发转码问题。建议在使用lighting时,确保CSV文件编码设置正确,以避免类似问题。虽然使用第三方工具如lighting迁移速度较快,但存在一定的风险。PingCap的异构迁移工具正在测试中,据说速度比kettle快,但与sqluldr2+lighting组合相比,仍有改进空间。后续测试结果出炉后,将会分享更详细的评估。