银行数据库迁移至MySQL,竟被时间字段这玩意耍了……

作者: admin 分类: 公众号存档            0 次浏览 发布时间: 2021-05-22 23:59

【转载声明】本文为转载文章,原作者「农行数风云团队」,版权归原作者所有。 原文链接:https://mp.weixin.qq.com/s/OT1R8-9HzgjcyV76fLZ8ug

公众号:杨建荣的学习笔记 · 作者:农行数风云团队 · 发布:2021-05-22 23:59:26 · 原文链接

作者介绍

农行研发中心“数风云”团队,一支朝气蓬勃、快速成长的技术团队,始终致力于农行大数据、数据库和云计算等领域的应用实践与技术创新,探索数据赋能,勇攀数据云巅,为企业数字化转型和金融科技发展不断贡献力量。

背景介绍

笔者在工作中曾遇到SyBase数据库迁移至MySQL时的一个问题:使用bcp将SyBase中的数据导出为csv文件时,datetime数据类型默认导出格式与MySQL不兼容。Sybase默认的datetime类型格式为Mmm dd yyyy hh:nn:ss:sssAA,示例如下:

Dec 24 2017 12:00:00:000PM

而MySQL中datetime类型格式为yyyy-mm-dd hh:nn:ss,示例如下:

2017-12-24 12:00:00

因此直接将csv文件导入MySQL会由于不兼容导致报错。

解决方式

解决此问题的方式不外乎两种:一是修改导出后的csv文件,令其时间字段的数据格式兼容MySQL;二是修改SyBase数据库中时间字段的数据格式,使其直接能通过bcp导出兼容MySQL的csv文件。鉴于第一种方法较为复杂,本文笔者采用第二种方法解决该问题。

1、convert()函数介绍

convert()函数是SyBase数据库中用于数据类型转换的函数,其使用方式如下:

convert(datatype,expression,[format-style])

  • datatype:必选参数,将要转换成的数据类型;

  • expression:必选参数,待转换的字段;

  • format-style:可选参数,转换时间类型时,决定输出格式的参数,对应关系见下表:

format-style的值 输出格式 输出示例
100 Mmm dd yyyy hh:nnAA Dec 24 2017 12:00PM
101 mm/dd/yyyy 12/24/2017
102 yyyy.mm.dd 2017.12.24
103 dd/mm/yyyy 24/12/2017
104 dd.mm.yyyy 24.12.2017
105 dd-mm-yyyy 24-12-2017
106 dd Mmm yyyy 24 Dec 2017
107 Mmm dd,yyyy Dec 24,2017
108 hh:nn:ss 12:00:00
109 Mmm dd yyyy hh:nn:ss:sssAA Dec 24 2017 12:00:00:000PM
110 mm-dd-yyyy 12-24-2017
111 yyyy/mm/dd 2017/12/24
112 yyyymmdd 20171224

例如有一个名为test的表,将该表中一个名为changetime,类型为datetime的字段转换为varchar类型,可以使用如下SQL语句:

select convert(varchar(100),changetime,111) as dates from test;

若该字段仅有一行数据,其值为Dec 24 2017 12:00:00:000PM,那么以上SQL输出的结果为2017/12/24.

2、str_replace()函数介绍

str_replace()参数用于替换字符串中的部分字符,其使用方式如下:

str_replace(‘string1’,’string2’,’string3’)

参数含义:

  • string1:必选参数,原始字符串;

  • string2:必选参数,待转换的字符;

  • string3:必选参数,需要转换成的字符;

例如以下SQL:

select str_replace(‘2017/12/24’,’/’,’-’);

其输出结果为2017-12-24.

3、具体方案实施

由以上示例可见,若将SyBase中datetime类型字段使用convert()函数转换为varchar类型,format-style的值指定为111,再使用str_replace()函数,将convert()转换来的字符串中的’/’转换为’-’,即可满足MySQL中对datetime类型的格式要求(yyyy-mm-dd);同理,format-style的值指定为108,即可满足hh:nn:ss的格式要求。具体的实施方案举例说明如下:

1)在SyBase数据库建立一张临时表tmp,表结构与待导出数据的表test一致,仅datetime类型字段改为varchar类型;表结构见以下SQL语句:

create table test(id int,time datetime);

create table tmp(id int,time varchar(100));

2)采用如下SQL语句将原始表的数据存入临时表中:

insert into tmp select id,str_replace(convert(varchar(100),time,111),’/’,’-‘)

+’ ‘+convert(varchar(100),time,108) from test;

3)将临时表tmp中的数据使用bcp命令导出为csv文件;

4)将csv文件中的数据导入MySQL数据库对应表中。

至此,解决了SyBase中datetime类型字段默认导出格式与MySQL不兼容的问题。

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注