摘 要: 在跨数据库产品进行批量数据迁移时,有时会遇到一些数据记录因某个字段的数据最后一个字节或最后两个字节数据为不可见字符而无法迁移的情况,如果此类数据记录较多的话,将给数据迁移工作造成极大困扰和障碍。在本文中,作者采用“凑整法”实现了对此类批量数据迁移问题的解决,并通过两个典型的数据库产品进行了验证。
关键词: 批量数据迁移;不可见字符;凑整法
中图分类号: TP311 文献标识码: B DOI:10.3969/j.issn.1003-6970.2020.06.035
本文著录格式:张雨萌.“凑整法”在跨数据库产品批量数据迁移过程中的应用[J]. 软件,2020,41(06):169170+207
【Abstract】: In the process of batch data migration across database products, sometimes some data records cannot be migrated because the last one byte or last two bytes of data of a field are invisible characters. If there are many records of such data, it will cause great troubles and obstacles to the data migration.In this paper, the author solves the problem of this kind of batch data migration by means of “rounding up” method and verifies it through two typical database products.
【Key words】: Batch data migration; Invisible characters; “rounding up” method
0 引言
在生產实践过程中,有时会在数据库中出现 某字段存在“不完整”数据的情况。而这些“不完整”数据的由来,基本上是由于应用程序在没有校验长度的情况下,将超出数据表字段长度的输入 数据插入数据表,导致输入数据被数据库截断。如果被截断的数据属于英文字符,截断只影响该条数据记录的准确性;而如果是中文汉字被截断,该字 段会因字符集不同而在最后一位或者最后两位出现不可见字符,不仅准确性受影响,此类“不完整”数据记录也无法同“完整”数据记录同步批量迁 移到其他数据库产品中。“不完整”数据样例如表1所示。
其中,0X表示16进制,而CA、E6、B5为对应汉字在16进制下的数据。
1 凑整法
1.1 定义
令“+”为字符串追加操作,“A”+“B”=“AB”;
令“–”为字符串删除操作,“ABA”–“A”=“B”;
令“I”为字符串“ ?”,即“空格”+“空格”+“?”,其中“空格”和“?”都为英文半角字符;
令“←”为字段赋值操作,X←“A”的含义为将“A”赋值给字段X;
令len(X)为获取字段X长度的函数;
令str(X)为获取字段X内容的函数;
令trim(str)为去掉字符串str左右两侧空白符的函数;
令ori为原始数据保存字段。
1.2 凑整法处理过程
结合2.1,凑整法处理过程如下:
凑整法处理过程
(1)加项凑整:令mod1←ori + I,其中,len(mod1) = len(ori) + 3;
(2)减项处理:令mod2←trim(str(mod1) - “?”)
(3)mod2即为最终数据
2 实验验证
2.1 实验环境
之所以选择Sybase数据库作为数据迁出数据库,是由于Sybase数据库存在数据长度超过varchar
类型字段长度时会出现的截断的情况;而Oracle工具sqldr会根据字符集按字节读取中文字符数据,如果在数据记录的某个字段最后一位或最后两位出现不可见字符时,slqldr会认为该字段未结束,进而将字段分隔符中的两位或者一位认为是数据内容,导致该字段之后的数据无法正常解析,影响数据导入。
2.2 实验过程
实验过程
Sybase导出:
(1)在Sybase中新建city_tmp表,字段名同city表一致,字段长度改为varchar(10);
(2)将city表中每一条数据的cityname字段内容拼接“ ?”后插入到city_tmp;
(3)使用Sybase的bcp工具导出city_tmp表到文件export_tmp;
(4)使用sed命令对export_tmp文件采取删 “?”操作,并生成新的文件export_data;
Oracle导入:
(5)在Oracle中新建city、city_tmp表,字段名同city表一致,字段长度为varchar(9);
(6)使用Oracle的sqlldr工具将文件export_ data导入city_tmp;
(7)将city_tmp中的数据导入到city表,导入过程中,要对cityname增加trim操作。
2.3 实验结果
经验证,sybase数据库的city表数据成功导入到oracle中。在oracle数据库的city表中,cityname字段最后一个汉字虽然为乱码,但是考虑到原始数据的信息已经不准确,导入之后的数据已经最大化保证了数据的可用性和准确性。
经实验验证,“凑整法”应用于跨数据库产品批量数据迁移是有效、可行的,其过程可用图1表示。
3 总结
如果應用系统使用的数据库产品存在截断机制,且应用系统未对输入信息进行长度校验的话,保存输入信息的字段中包含不可见字符是大概率事件。对于这些存在不可见字符的数据,其在后续的跨数据库产品数据迁移过程中也将给迁移过程带来困扰和障碍。
本文使用“凑整法”来解决此类数据的迁移问题,经实验证明是可行的、有效的。通过解决此类数据的跨数据库数据迁移问题,最大程度地保证了数据的可用性和准确性,其实践价值和参考意义都是重大的。
数据完整性、准确性的意义无须赘言,笔者作为一线工程师,建议应用系统开发者,严格依照“接口文档”或者“设计文档”的要求,对输入信息进行包含格式和长度的校验,从信息入口扎紧篱笆墙,过滤掉问题数据。
参考文献
[1] 赵桔青, 陶福寿. 基于GIS的城镇土地资源承载力评价[J]. 软件, 2018, 39(7): 52-56.
[2] 高新, 袁健华. 椭圆方程最优控制问题的数值算法研究[J]. 软件, 2018, 39(7): 57-62.
[3] 皮祖成, 陈文, 马龙, 等. 面向对象的无人机任务设备通信接收软件设计[J]. 软件, 2018, 39(7): 63-67.
[4] 庄亚飞, 李素敏. 基于Python的ArcGIS数据属性值顺序码处理研究[J]. 软件, 2018, 39(7): 68-71.
[5] 师海忠, 陈璐璐. k次Herschel?????????????????????????????—师连通圈网络[J]. 软件, 2018, 39(7): 72-78.
[6] 贡智兵, 王祖进. 城轨门系统接触参数实验获取方法研究[J]. 软件, 2018, 39(7): 79-83.
[7] 李天赐, 田精白. 基于SSH框架卫生科技成果申报系统的设计与实现[J]. 软件, 2018, 39(7): 84-88.
[8] 陈星, 赵佳萌, 宣军法. 移动应用自动化兼容性测试方法综述[J]. 软件, 2018, 39(7): 89-94.
[9] 傅涛. 基于源码与二进制文件的漏洞挖掘技术[J]. 软件, 2018, 39(7): 95-97.
[10] 文平, 杨丽英. Sybase数据库在UNIX、Windows上的实施和管理[M], 2010.
[11] Jonathan Lewis. Oracle核心技术[M], 2013.