工具:Navicat Premium 15

下载地址

注:Navicat Premium是收费软件,但有15天试用期,对于迁移数据来说这使用期限足矣,我们是借助他的数据传输功能实现从MySQL数据库迁移到SQL SERVER数据库

特别敬告:操作前请先备份数据库!操作前请先备份数据库!操作前请先备份数据库!

使用方法:

1、点击Navicat Premium的工具->数据传输菜单

Windows mysql数据库文件夹拷贝到data文件下 mysql数据库迁移_数据

2、设置源数据和目标数据库,即源数据是待迁移的数据库,目标数据库是要迁移到的数据库;然后点击下一步即可。

Windows mysql数据库文件夹拷贝到data文件下 mysql数据库迁移_字段_02

3、选择需要迁移的表

Windows mysql数据库文件夹拷贝到data文件下 mysql数据库迁移_数据库_03

最后点击开始按钮即可迁移,不过有可能会遇到一些错误,如下:

一、mysql的这种(0000-00-00 00:00:00)默认日期,这会导致迁移失败,所以得要清洗数据后才作迁移,方法见下:

1、查找出数据库所有表datetime类型的字段,然后通过CONCAT函数组装出一个UPDATE语句

SELECT
	CONCAT( 'UPDATE ', TABLE_NAME, ' SET ', COLUMN_NAME, '=\'2020-01-22\' where ', 'DATE_FORMAT(', COLUMN_NAME, ', \'%Y-%m-%d %H:%i:%s\')', '=\'0000-00-00 00:00:00\';' ) 
FROM
	information_schema.`COLUMNS` 
WHERE
	TABLE_SCHEMA = '你的数据库名字' 
	AND DATA_TYPE = 'datetime' 
ORDER BY
	TABLE_NAME,
	ORDINAL_POSITION;

2、把上面获取到的UPDATE语句放到Navicat Premium的查询窗口执行即可批量更新默认日期,示例如下:

UPDATE your_table SET add_time='2020-01-22' where add_time='0000-00-00 00:00:00';

二、mysql tinyint类型字段的值如果是负数会导致迁移到sql server失败,所以得先批量修改表tinyint类类型为int类型,方法见下:

1、查找出数据库所有表tinyint类型的字段,然后通过CONCAT函数组装出一个ALTER TABLE语句

SELECT
    CONCAT('ALTER TABLE `你的数据库名字`.`',TABLE_NAME, 
'` MODIFY COLUMN `',COLUMN_NAME,'` int(4) NULL DEFAULT NULL;')
FROM
    information_schema.`COLUMNS`
WHERE
    TABLE_SCHEMA = '你的数据库名字' and DATA_TYPE='tinyint'
ORDER BY
    TABLE_NAME,
    ORDINAL_POSITION;

2、把上面获取到的ALTER TABLE语句放到Navicat Premium的查询窗口执行即可批量更新默认日期,示例如下:

ALTER TABLE `你的数据库名字`.`admin_group` MODIFY COLUMN `is_enable` int(4) NULL DEFAULT NULL;

三、清洗表字段值没有转义的单引号,这可能是因为数据库被注入过或程序员对数据输入时没做严格限制导致的,方法见下:

1、查找出数据库所有表varchar和text类型的字段,然后通过CONCAT函数组装出一个UPDATE语句

SELECT
CONCAT('UPDATE ',TABLE_NAME,' SET ',COLUMN_NAME,'=replace(',COLUMN_NAME,',\'\\\'\',"")', ' where ',COLUMN_NAME,' like \'%\\\'%\';')
FROM
    information_schema.`COLUMNS`
WHERE
    TABLE_SCHEMA = '你的数据库名字' and (DATA_TYPE='varchar' or DATA_TYPE='text')
ORDER BY
    TABLE_NAME,
    ORDINAL_POSITION;

2、把上面获取到的UPDATE语句放到Navicat Premium的查询窗口执行即可批量更新即可,示例如下:

UPDATE your_table SET member=replace(member,'\'',"") where member like '%\'%';

注:其它类似这样的数据问题以此类推即可

至此完美解决MySQL数据库迁移到SQL SERVER数据库