【问题标题】:Converting SQL Server data to MySQL将 SQL Server 数据转换为 MySQL
【发布时间】:2015-06-29 20:29:49
【问题描述】:

我正在尝试将一些 SQL Server 数据转换为 mySQL,但遇到一个又一个障碍。

我认为最简单的方法是将 SQL Server 数据导出为 CSV 并以这种方式导入(我几乎不知道这并不容易......!)。一旦我弄清楚如何让它在 CSV 中添加引号,我就尝试导入到 mySQL。现在,由于某种原因,数据都是用引号导入的。这是我的 mySQL 查询:

LOAD DATA INFILE 'file.csv' INTO TABLE test
FIELDS ENCLOSED BY '"'
TERMINATED BY ","
LINES TERMINATED BY "\n"

这会导入,但它似乎忽略了引号,并且当数据中存在逗号时,它会完全搞砸该行。数据也被导入,包括引号,直接从表格中查看这些数据:

"1" "1" "0" "{08CA6F70-735D-46ED-8EAB-C17A8BED1FCD}"    "Reporting_1"   "60"        "Reporting" "ABC"   "2008-04-21 19:25:28.013000000" "False" "True"  "False" "True"  "3" "164"   "2033"  "565077"    "7929083"   "334980"    "2013-01-11 15:35:45.970000000" "False" ""  "0" "False" ""  "0" "0" ""  ""  "False" "False" "True"  "True"  ""  ""  "False"

我需要用 PHP 对这些数据进行一些后期处理,所以我假设我可以用我的代码去掉引号。没有使用 trim() 函数修剪引号(它只是不起作用),所以我用 str_replaced 替换了引号,这似乎确实有效,但是:

我正在重新映射数据并将其插入另一个 mySQL 表(具有不同的列名)。在插入上面处理过的数据时,并非所有数据都与数据库查询相交。以这个查询为例:

INSERT INTO tesxf.xf_node           (`node_id`,`parent_node_id`,`title`,`description`,`node_name`,`node_type_id`,`display_in_list`) 
VALUES 
('2123','2281','Container Name','','38064','Forum','1')

node_id 和 title 等进入新数据库,但 parent_node_id 永远不会。该值始终插入为 0。当我复制上面的查询并手动运行它时,它会正确插入数据。此外,如果我通过mysql_real_escape_string运行数据,结果是这样的(这里只转换了两个字段):

INSERT INTO tesxf.xf_node 
(`node_id`,`parent_node_id`,`title`,`description`,`node_name`,`node_type_id`,`display_in_list`) 
    VALUES 
    ('673','\0\06\08\08\0\0','\0\0S\0t\0o\0r\0y\0 \0W\0r\0i\0t\0i\0n\0g\0 \0-\0 \0F\0o\0r\0u\0m\0\0','','240576','Forum','1')

我以前从未见过这个。这让我觉得也许从导入的表中收到的数据格式有些奇怪,有些隐藏字符我看不到?我怎样才能把这些去掉?这可能是数据一开始没有正确导入的原因吗?

我认为我正在运行 SQL Server 2012(不太熟悉)。我的 mySQL 实例在 OSX 10.6 上运行并且通常很好(我使用 postgres 和 oracle 等进行了类似的导入)。

Mysql 是:mysql Ver 14.12 Distrib 5.0.92,适用于 apple-darwin10.0 (i386),使用 EditLine 包装器 PHP 为:PHP 5.3.26 (cli)(构建时间:2013 年 7 月 7 日 18:30:38)

在这里失去理智...我想我的下一个尝试是将构造的查询通过管道传输到一个文本文件中,然后手动运行它...我希望我错过了一些简单的东西。

CSV 文件以二进制模式通过 FTP 传输,我使用 vim 将 :set ff=unix 应用于它们(正如我在此处阅读的那样,这可能是一个问题)。

我还尝试在此服务器 + 1 个其他服务器上安装 PHP 的 SQL Server/freetds 包装器,但不要让我开始这样做!

【问题讨论】:

  • 好的,我想我可以通过替换空值 \0 字符来达到目的。这使我的查询正常工作,但仍然无法解释为什么数据首先包含那些!

标签: mysql sql-server csv export-to-csv data-conversion


【解决方案1】:

您是否尝试过使用 MySql 迁移工具包?如果没有,你可以试试。这是链接MySql Migration Toolkit

【讨论】:

  • 这看起来很有希望,谢谢!但我无法让它连接到 SQL 服务器。只是说连接被拒绝(同一台机器)。我检查了允许连接,甚至添加了防火墙规则。
  • 您可能会遗漏一些内容,请查看此链接Database Migration
  • 非常感谢您。这完全解决了我的问题!经过长时间的导出(数据库很大)后,我的数据似乎是一种可读的格式。值得一提的是,我的连接问题通过编辑 SQL 服务器的 TCP/IP 设置得到了解决(抱歉,有点含糊)。我丢失了帮助我的页面,但类似的解释在这里:dbaspot.com/ms-sqlserver/…
猜你喜欢
  • 2011-03-14
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多