有时需要把MS SQL数据库转换成MySQL,但苦于没有好用的工具,个人使用一个手工转换的方法,相对来说还是比较方便的,对于只导一两个表的时候。
思想:
通过mssql构造出MySQL的insert into 语句,保存到一个文本文件里,然后导入MySQL数据库。
方法扼要如下:
1.根据ms sql表结构同步创建出mysql表,可以使用mssql客户端工具生成mssql的建表语句,里面一般来说会带上COLLATE Chinese_PRC_CI_AS 及 CONSTRAINT [DF_xxx_xxx] 这样的部分,对mysql是没有用的,使用ue的查找替换功能将其删掉,替换“CONSTRAINT [DF_xxx_xxx] ”要使用正则表达式匹配 CONSTRAINT.*?]
2.将简化后的create table ... 语句改写成适合MySQL的建表语句,主要是字段类型的相应修改(mysql里没有nvarchar等以n打头的类型)、方括号替换成反引号、删掉mssql标识列定义等。
3.MySQL里执行create table建表。
4.回到mssql里,对每个文本型字段执行一次字符串替换,将单引号替换成mysql风格的转义符( '),语句大致如下:
update you_table_name set [field_name_1]=replace([field_name_1],'''','''')
里面mssql的单引号转义是两个单引号,所以看起来相当别扭,顺便逼视一下MS的脑残转义约定。
5.将mssql表里的非字符型字段改成字符型,当然不改也行,只是下面一步会很痛苦。
6.按下来我们要构造一系列用于把mssql记录插入MySQL表的insert 语句,
7.我们要在mssql里拼接字符串的形式构造该查询语句 select top 100 'inset into `you_table_name`(`field_name_1`,`field_name_2`,...)values('''+[field_name_1]+''','''+convert(varchar(10),isnull([field_name_2],0))+''',...);' from you_mssql_table
从这个语句里可以看出,如果是字符型字段,像field_name_1,直接使用mssql拼接符(+)连起来就可以了,但如果是数字型或日期型字段,像`field_name_2`,就要convert做转换了,日期型还要加上第三个参数,如convert(varchar(10),time,120)这样写。
我们可以先对前100条构造出适合MySQL的insert语句,随机复制几条到MySQL里测试是否可以正常插入。
8.确认无误后,从mssql里导出数据的方式,将上面的查询导出成access数据库文件,再从access中导出文本文件(也可以直接从mssql里导出文本),通常mssql导出的文本文件是ansi编码的,我们可以使用editplus之类工具打开并另存为utf-8编码。不推荐使用ue转换,经验教训表明ue转换编码容易出错。
9.进入mysql命令行客户端里,注意加上--default-character-set=utf8参数,否则很可能导入一团乱码
>mysql -uroot -p --default-character-set=utf8
10.进入相应数据库use you_database
11.执行source X:pathtoyoursqlfile.sql
应该很快可以完成,导入时可以注意一下是否有错误提示。通常不会有的。
12.至此转换完成。