工具:Navicat Premium 15
下载地址:
注:Navicat Premium是收费软件,但有15天试用期,对于迁移数据来说这使用期限足矣,我们是借助他的数据传输功能实现从MySQL数据库迁移到SQL SERVER数据库
特别敬告:操作前请先备份数据库!操作前请先备份数据库!操作前请先备份数据库!
使用方法:
1、点击Navicat Premium的工具->数据传输菜单
2、设置源数据和目标数据库,即源数据是待迁移的数据库,目标数据库是要迁移到的数据库;然后点击下一步即可。
3、选择需要迁移的表
最后点击开始按钮即可迁移,不过有可能会遇到一些错误,如下:
一、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数据库