思想:
通过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.至此转换完成。
如果你是使用php 程序转换我们要注意下面一些mysql与mssql数据类型与用法上的区别了
1 MySQL支持enum,和set类型,sql server不支持
2 MySQL不支持nchar,nvarchar,ntext类型
3 MySQL的递增语句是AUTO_INCREMENT,而mssql是identity(1,1)
4 msms默认到处表创建语句的默认值表示是((0)),而在MySQL数据库里面是不允许带两括号的
5 MySQL需要为表指定存储类型
6 mssql识别符是[],[type]表示他区别于关键字,但是MySQL却是 `,也就是按键1左边的那个符号
7 mssql支持getdate()方法获取当前时间日期,但是MySQL里面可以分日期类型和时间类型,获取当前日期是cur_date(),当前完整时间是 now()函数
8 mssql不支持replace into 语句,但是在最新的sql20008里面,也支持merge语法
9 MySQL支持insert into table1 set t1 = ‘’, t2 = ‘’ ,但是mssql不支持这样写
10 MySQL支持insert into tabl1 values (1,1), (1,1), (1,1), (1,1), (1,1), (1,1), (1,1)
11 mssql不支持limit语句,是非常遗憾的,只能用top 取代limt 0,N,row_number() over()函数取代limit N,M
12 MySQL在创建表时要为每个表指定一个存储引擎类型,而mssql只支持一种存储引擎
13 MySQL不支持默认值为当前时间的datetime类型(mssql很容易做到),在MySQL数据库里面是用timestamp类型
14 mssql里面检查是否有这个表再删除,需要这样:
代码如下 | 复制代码 |
if exists (select * from dbo.sysobjects where id = object_id(N'uc_newpm') and OBJECTPROPERTY(id, N'IsUserTable') = 1) |
但是在MySQL里面只需要 DROP TABLE IF EXISTS cdb_forums;
15 MySQL支持无符号型的整数,那么比不支持无符号型的mssql就能多出一倍的最大数存储
16 MySQL不支持在mssql里面使用非常方便的varchar(max)类型,这个类型在mssql里面既可做一般数据存储,也可以做blob数据存储
17 MySQL创建非聚集索引只需要在创建表的时候指定为key就行,比如:KEY displayorder (fid,displayorder) 在mssql里面必须要:
代码如下 | 复制代码 |
create unique nonclustered index index_uc_protectedmembers_username_appid on dbo.uc_protectedmembers (username asc,appid asc) |
18 MySQL text字段类型不允许有默认值
19MySQL的一个表的总共字段长度不超过65XXX。
20一个很表面的区别就是MySQL数据库的安装特别简单,而且文件大小才110M(非安装版),相比微软这个庞然大物,安装进度来说简直就是.....
21MySQL的管理工具有几个比较好的,MySQL_front,和官方那个套件,不过都没有SSMS的使用方便,这是MySQL很大的一个缺点。
22MySQL的存储过程只是出现在最新的版本中,稳定性和性能可能不如mssql。
23 同样的负载压力,MySQL要消耗更少的CPU和内存,mssql的确是很耗资源。
24php连接MySQL和mssql的方式都差不多,只需要将函数的MySQL替换成mssql即可。
25MySQL数据库支持date,time,year类型,mssql到2008才支持date和time。
下面我来给大家介绍一些的转换工具
MSSQL2MYSQL
Microsoft DTS
SQLyog
Access Export
Text Import/Export
Microsoft DTS应该算是MSSQL自带的导入导出工具吧,在导入导出ACCESS和文本等方面MSSQL还是很不错的,不过我在MSSQL2005的导入导出工具中竟然没有找到ODBC,够晕,难道没有?看来还需要查查文档。
而Access Export就是Access的导出工具,导出的时候选择ODBC,当然也需要先配置好MYSQL的ODBC参数才好进行。
SQLyog是一个MYSQL的管理工具吧,由于懒得下载,所以也没有测试。
Text Import/Export这个我在phpMyAdmin工具中导入文本文件即可,这可能比较适合小量的数据,对于大量的工具我想就不是很方便了。
大家可以百度搜索直接使用工具转换了