如上所述,如果您的資料中包含制表符,逗号或換行符,那麼使用CSV導出和導入資料将非常困難。值将從字段中溢出,您将獲得錯誤。如果您的任何長字段都包含多行文本,其中包含換行符,則此問題會更加嚴重。
在這些情況下,我的方法是使用BCP指令行實用工具從SQL Server導出資料,然後在MySQL中使用LOAD DATA INFILE .. INTO TABLE指令讀取資料檔案。BCP是最早的SQL Server之一指令行實用程式(可追溯到SQL Server v6.5的誕生),但它仍然存在,并且仍然是擷取資料的最簡單,最可靠的方法之一。
要使用此技術,您需要在MySQL中使用相同或等效的架建構立每個目标表。通過右鍵單擊SQL企業管理器中的“資料庫”,然後單擊“任務”->“生成腳本...”,并為所有表建立一個SQL腳本,可以做到這一點。然後,您必須手動将腳本轉換為與MySQL相容的SQL(這絕對是工作中最糟糕的部分),并最終在MySQL資料庫上運作CREATE TABLE指令,以便将表與SQL Server版本進行逐列比對,為空且準備好資料。
然後,從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';
不要忘記,表(此示例中的TableName)必須已經在MySQL端建立。
在轉換SQL模式時,此過程非常麻煩,但是它适用于最困難的資料,并且由于它使用平面檔案,是以您無需說服SQL Server與MySQL對話,反之亦然。