V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
bonfy
V2EX  ›  程序员

求助: SQLSERVER 2005 迁移到 Mysql 的解决方案

  •  
  •   bonfy · 2016-12-26 16:41:29 +08:00 · 3737 次点击
    这是一个创建于 2919 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位万能的V友,请问下  SQLSERER 2005 数据 如何迁移到 Mysql,有什么好的方法么?

    目前我想到的方法是:

    1. 导出 excel (.xls)
    2. 用 csvkit 将 xls 转成 csv
    3. 将 csv 导入到 mysql  (第三步还没实践)

    几点说明:

    • 关于不用导入导出向导->导出 dsn? 后来查了才知道的,也不知道靠谱不,不确定,用过的可以为之正名
    • 关于为什么要先导出 excel 转成 csv? 因为 数据里面有",",我已经尝试过了会有点问题
    • 关于 csvkit? Python 的一个比较好用的工具,效果不错,地址https://github.com/wireservice/csvkit

    这样看起来的话,还是有点复杂,而且我还没有尝试将 csv 导入到 mysql,不清楚会不会有中文字符问题,毕竟 Sql server 2005 是 Chinese_PRC_CI_AS,导出后导入 mysql 不一定兼容

    求教V友有没有这方面的经验的,指点一二,有什么简单的方法能够完成,而且最好能解决掉中文字符集的问题(存入 Mysql 最好用 utf-8 格式)。

    先在此谢谢各位

    35 条回复    2016-12-27 20:39:42 +08:00
    bonfy
        1
    bonfy  
    OP
       2016-12-26 16:51:46 +08:00
    其实目前的情况是我手边正好也没有 mysql 的数据库(最终是用 mysql ),就先拿 sqlite3 做了下测试

    发现成功将 csv 导入到 sqlite3 中了,在 sqlite3 的管理界面里也看到中文数据了,但是用 python peewee 去连 sqlite3 发生了
    peewee.OperationalError: Could not decode to UTF-8 column 'name' with text '
    \ufffd\ufffd\ufffd\ufffd'

    当然这个是 Windows 下的状况,我怀疑是中文字符集问题,当然也可能是 windows 的锅,回去试试 mac

    如果有哪位 V 友有经验,请指教一二,谢谢
    zouxy
        2
    zouxy  
       2016-12-26 17:26:31 +08:00 via iPhone
    字段不多的话建议自己写个程序脚本 要转换字符集什么的
    现成的工具不一定能满足要求
    shiny
        3
    shiny  
       2016-12-26 18:06:47 +08:00 via iPhone
    表不多的话,自己写程序更可靠点。
    darrenfang
        4
    darrenfang  
       2016-12-26 18:19:48 +08:00 via iPhone
    navicat 有数据同步功能,可以同步 2 个不同的数据库,另外用 navicat 也可以导入 excel
    tuimaochang
        5
    tuimaochang  
       2016-12-26 18:43:50 +08:00
    mhycy
        6
    mhycy  
       2016-12-26 18:51:55 +08:00
    都在线的话,写程序搬
    无论是 CSV 还是 XLS 都会因为字符串问题一堆坑

    PS. 提醒, CSV 是个极其不可靠的格式
    bonfy
        7
    bonfy  
    OP
       2016-12-26 18:57:32 +08:00
    @zouxy @shiny 嗯 正在自己码,就是累啊,想想如果有现成的轮子可以省好多时间
    bonfy
        8
    bonfy  
    OP
       2016-12-26 18:58:02 +08:00
    @darrenfang 这个 navicat 有 mac 版么
    keniusahdu
        9
    keniusahdu  
       2016-12-26 18:58:32 +08:00
    @bonfy 有 mac 版.
    bonfy
        10
    bonfy  
    OP
       2016-12-26 19:00:32 +08:00
    @mhycy 是啊,已感受 csv 。。。又要面对这些字符集大坑,抓狂😫
    darrenfang
        11
    darrenfang  
       2016-12-26 19:41:33 +08:00 via iPhone
    @bonfy 有,但是我没用过 Mac 的数据同步功能,不知道是不是一样的
    em70
        12
    em70  
       2016-12-26 19:42:57 +08:00
    SQLSERVER 先转 access,然后用 access 转 mysql 专用工具,效果很好
    bonfy
        13
    bonfy  
    OP
       2016-12-26 20:21:44 +08:00
    @darrenfang @keniusahdu mac 上装了试了一下,没有中文的导入报了两个 error ,不过有数据导入,但是有中文的报了 3 个 error ,没有数据导入。。。还在尝试。。。
    bonfy
        14
    bonfy  
    OP
       2016-12-26 20:22:40 +08:00
    @em70 还要转 access....又要装一个微软的东东...
    collo
        15
    collo  
       2016-12-26 20:45:13 +08:00
    试一下 DB2DB 工具,我上次试了下 MSSQL 转 Sqlite3 效果不错。

    不过这个工具收费的。
    em70
        16
    em70  
       2016-12-26 20:47:37 +08:00
    @bonfy sqlserver 自带转 access 的功能吧
    bonfy
        17
    bonfy  
    OP
       2016-12-26 20:56:11 +08:00
    @em70 哦,你说的是导出 access...了解了,刚才理解错了 ;这个可以试试:)
    bonfy
        18
    bonfy  
    OP
       2016-12-26 20:59:12 +08:00
    @darrenfang @keniusahdu

    有进展了,从 xls 直接导入 navicat 有问题。不过我先转成 csv,然后改了下字段长度,终于成功导入了中文。
    vibbow
        19
    vibbow  
       2016-12-26 21:04:26 +08:00
    M$ Access ,用 ODBC 连接两个数据库。
    然后复制粘贴即可......
    foo2bar
        20
    foo2bar  
       2016-12-26 21:54:48 +08:00
    这 5 个多小时你一直在折腾数据的导入么?
    被这种精神感动,是夏目友人帐的那种感动
    bonfy
        21
    bonfy  
    OP
       2016-12-26 22:04:11 +08:00
    @foo2bar 差不多了

    总结下就是工具虽然方便,但是在导入的时候自动判断字段的属性 还有长度 其实大部分时候是错的,调整起来也是真的麻烦

    所以如果要多次迁移的话,还是自己写代码保险,一劳永逸; 就一次的话,工具也是可以用用的,但是工具真的也有工具的问题,谁用谁知道啊。。。
    satifanie
        22
    satifanie  
       2016-12-26 22:07:54 +08:00
    你需要的是 Kettle
    DRcoding
        23
    DRcoding  
       2016-12-26 22:18:11 +08:00
    kettle 做数据清洗和转移是很方便的,各种方便的组件。

    另外,导入数据到 mysql 中最高效的方法是 mysql 的 load 方法,可以先从 mysql 查询数据写到一个文本文件中,然后再 load 进 mysql 当中。
    billlee
        24
    billlee  
       2016-12-26 23:09:20 +08:00
    SQLite3 管理界面是什么鬼, SQLite 并没有官方 GUI 吧
    bonfy
        25
    bonfy  
    OP
       2016-12-27 08:13:30 +08:00
    @satifanie @DRcoding 嗯,反正都已经折腾到现在了, Kettle 我也一并去试试看吧。。。或许有惊喜呢
    bonfy
        26
    bonfy  
    OP
       2016-12-27 08:15:58 +08:00
    @billee 好吧,我描述有问题, SQLite 命令行界面

    $ sqlite3 test.db
    sqlite> select * from table;

    这样是可以看到中文显示,但是用 peewee 读表,就是字符集错误
    realpg
        27
    realpg  
       2016-12-27 09:06:58 +08:00
    写程序搬,不用任何转换工具
    总共的表数如果少,那么直接针对每个表写个搬迁程序,一个表一个
    总表如果多,就写一个通用转换读取表 meta 信息的全自动化转
    ebony0319
        28
    ebony0319  
       2016-12-27 09:28:14 +08:00
    http://dev.mysql.com/downloads/connector/net/
    这是 Mysql 官方的提供的 connector-net 的包。

    第一步:
    ```
    select COLUMN_NAME,case when DATA_TYPE='varchar' then DATA_TYPE+'('+CAST(CHARACTER_MAXIMUM_LENGTH as varchar(20))+')' when DATA_TYPE='numeric' or DATA_TYPE='decimal' then DATA_TYPE+'(10,5)'
    else DATA_TYPE end as 'type'
    ,CHARACTER_MAXIMUM_LENGTH,* from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='你的表'

    ```
    然后创建你的 mysql 表

    程序迁移。
    sxy707
        29
    sxy707  
       2016-12-27 11:24:44 +08:00
    kettle
    ebony0319
        30
    ebony0319  
       2016-12-27 11:40:24 +08:00
    https://drive.google.com/file/d/0B8gkQ67RbZnuQ2JNNWk5VFFFbzg/view

    随便写的,你可以稍微改一下。实测可以。
    bonfy
        31
    bonfy  
    OP
       2016-12-27 12:43:21 +08:00
    @ebony0319 要下班后回家才能翻 qiang ,回去再看,先行谢过。
    bonfy
        32
    bonfy  
    OP
       2016-12-27 12:43:42 +08:00
    @sxy707 软件要 800M ,回去再下载试试
    satifanie
        33
    satifanie  
       2016-12-27 17:12:00 +08:00
    @bonfy 如果数据量不大,可以直接使用向导生成。 如果数据量大,需要用分页支持。请使用 5.x 版本吧。 6.x 7x 资源要的多
    bonfy
        34
    bonfy  
    OP
       2016-12-27 20:09:55 +08:00
    @ebony0319 哇塞,整一个项目工程啊,慢慢看。。。
    ebony0319
        35
    ebony0319  
       2016-12-27 20:39:42 +08:00 via Android
    可以遍历数据库所有表,然后创建表和字段。都在 INFORMATION_SCHEMA.COLUMNS 表里面。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3328 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:26 · PVG 19:26 · LAX 03:26 · JFK 06:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.