如上所述,如果您的数据包含数据中的制表符,逗号或换行符,那么导出和导入CSV将非常困难。 值将溢出字段,您将收到错误。 如果您的任何长字段包含带有换行符的多行文本,则此问题会更严重。
我在这些情况下的方法是使用BCP命令行实用程序从SQL服务器导出数据,然后在MySQL中使用LOAD DATA INFILE .. INTO TABLE命令重新读取数据文件.BCP是最古老的SQL Server之一 命令行实用程序(可以追溯到SQL服务器的诞生 - v6.5)但它仍然存在,并且仍然是最简单,最可靠的数据输出方式之一。
要使用此技术,您需要在MySQL中使用相同或等效的模式创建每个目标表。 我通过右键单击SQL企业管理器中的数据库,然后单击任务 - >生成脚本...来为所有表创建一个SQL脚本。 然后,您必须手动将脚本转换为MySQL兼容的SQL(绝对是作业中最糟糕的部分),最后在MySQL数据库上运行CREATE TABLE命令,这样就可以在列式方面为SQL服务器版本提供匹配的表,空并准备好 数据。
然后,从MS-SQL端导出数据,如下所示。
bcp DatabaseName..TableName out TableName.dat -q -c -T -S ServerName -r \0 -t !\t!
(如果您使用的是SQL Server Express,请使用-S值,如下所示:-S“ComputerName \ SQLExpress”)
这将创建一个名为TableName.dat的文件,其字段由![tab]分隔! 和\ 0 NUL字符分隔的行。
现在将.dat文件复制到MySQL服务器上的/ tmp并加载到MySQL端,如下所示:
LOAD DATA INFILE '/tmp/TableName.dat' INTO TABLE TableName FIELDS TERMINATED BY '!\t!' LINES TERMINATED BY '\0';
不要忘记必须在MySQL端创建表(本例中的TableName)。
在转换SQL模式时,此过程非常简单,但它适用于最困难的数据,因为它使用平面文件,您永远不需要说服SQL Server与MySQL通信,反之亦然。