將 MySQL 資料遷移至 SQL Server,官方推薦路徑為:MySQL ODBC 驅動 → 系統 DSN → SQL Server 匯入嚮導。本文詳細記錄每一步配置細節、字符集陷阱與驗證方法,確保遷移零資料損失、零亂碼。
SELECT、LOCK TABLES、SHOW VIEW 權限下載 MySQL Connector/ODBC 8.0+** (Unicode 版):
• 64 位系統安裝 64 位驅動(匹配 SQL Server 位數)
• 安裝包:mysql-connector-odbc-8.0.xx-winx64.msi
C:\Windows\System32\odbcad32.exe| 欄位 | 值/說明 |
|---|---|
| Data Source Name | MySQL_Source (自定義,導入時選擇此名) |
| TCP/IP Server | MySQL 主機 IP 或主機名 |
| Port | 3306 (或自定義埠) |
| User / Password | MySQL 讀取帳號密碼 |
| Database | 下拉選擇要遷移的具體資料庫 |
關鍵:Connection Options → Character Set
• MySQL 為 utf8mb4 → 選擇 utf8mb4
• MySQL 為 gbk → 選擇 gbk
• 錯誤選擇 latin1 將導致中文變「???」或亂碼**
DSN=MySQL_Source; (或展開屬性填寫)映射檢查清單:
VARCHAR→NVARCHAR、INT→INT、DATETIME→DATETIME2、TEXT→NVARCHAR(MAX)-- 1. 行數核對
SELECT 'MySQL' AS src, COUNT(*) FROM mysql_db.tbl
UNION ALL
SELECT 'SQLServer', COUNT(*) FROM sqlserver_db.dbo.tbl;
-- 2. 關鍵業務欄位抽樣
SELECT * FROM sqlserver_db.dbo.tbl WHERE chinese_col LIKE N'%中文%';
-- 3. 主鍵/自增/索引檢查
EXEC sp_help 'dbo.tbl';
| 現象 | 原因 | 解決 |
|---|---|---|
| 中文變 ??? / 亂碼 | DSN Character Set 未設或設錯 | 重建 DSN,嚴格匹配 MySQL 字符集 |
| 大字段截斷 | 目標欄位長度不足 (VARCHAR(8000) 上限) | 映射為 NVARCHAR(MAX) / VARBINARY(MAX) |
| 自增列衝突 | 遷移數據含 ID,目標表自增種子衝突 | DBCC CHECKIDENT ('tbl', RESEED, max_id) |
| 視圖/存儲過程失敗 | 語法不兼容 (LIMIT vs TOP, IF vs CASE) | 僅遷移表數據,邏輯對象手工重寫 |
| 速度極慢 | ODBC 單線程、無批量提交 | 分批遷移、或用 SSIS/BCP/第三方工具 |
SELECT ... INTO OUTFILE → BCP 批量導入「MySQL ODBC 驅動 + 系統 DSN (正確字符集) + SQL Server 匯入嚮導」是中小數據量異構遷移的**標準化、零成本、可視化**路徑。核心鐵律:**DSN 字符集必須與 MySQL 實際字符集完全一致**,否則中文必亂碼。