遷移背景與目標
本白皮書針對需將 MySQL 資料庫遷移至 SQL Server 2000 的開發人員與 DBA,說明工具、資料類型對照、應用程式改造與疑難排解。雖然 SQL Server 2000 已停止支援,但遷移方法論對新版同樣適用。
架構差異速覽
| 特性 | MySQL (3.23/4.x) | SQL Server 2000 |
| 引擎類型 | MyISAM / InnoDB | 單一儲存引擎 |
| 交易支援 | InnoDB 支援 ACID | 完整 ACID |
| 外鍵約束 | InnoDB 支援 | 完整支援 |
| 預存程序/觸發器/檢視表 | 不支援 (舊版) | 完整支援 (T-SQL) |
| 子查詢 | 4.1 開始支援 | 完整支援 |
| 鎖定粒度 | 表鎖 / 行鎖 | 行鎖 / 頁鎖 / 表鎖 |
| 複寫 | 單向非同步 | 合併/交易/快照複寫 |
| OLAP/資料探勘 | 無 | Analysis Services 整合 |
遷移前置作業
- 盤點架構:匯出
SHOW CREATE TABLE、檢視表、觸發器、預存程序、使用者權限。
- 備份資料:
mysqldump --single-transaction --routines --triggers --all-databases > backup.sql。
- 比對資料類型:見下表,特別注意
ENUM/SET、UNSIGNED、TEXT/BLOB 對應。
- 保留字衝突:MySQL 允許的識別字可能為 SQL Server 保留字(如
order, group, key),需加 [] 或重新命名。
資料類型對照表
| MySQL | SQL Server 2000 | 備註 |
| TINYINT | TINYINT | MySQL 有 UNSIGNED |
| SMALLINT | SMALLINT | |
| MEDIUMINT | INTEGER | SQL Server 無 MEDIUMINT |
| INT/INTEGER | INT | |
| BIGINT | BIGINT | |
| FLOAT/DOUBLE | FLOAT/REAL | 精度對應 |
| DECIMAL(M,D) | DECIMAL(M,D) | 數值精確 |
| DATE | DATETIME | SQL Server 無純 DATE 型別 |
| TIME | DATETIME | 同上 |
| DATETIME | DATETIME | 範圍差異:MySQL 1000-9999,SQL Server 1753-9999 |
| TIMESTAMP | DATETIME | MySQL 自動更新 |
| CHAR/VARCHAR | CHAR/VARCHAR | SQL Server 8000 字元上限 |
| TEXT/BLOB | TEXT/IMAGE | SQL Server 2005+ 用 VARCHAR(MAX)/VARBINARY(MAX) |
| ENUM/SET | CHAR/VARCHAR + CHECK | 需自行建立 CHECK 約束 |
| BIT | BIT | SQL Server 2000 不支援 BIT |
遷移工具與方法
方法一:DTS (Data Transformation Services) - 推薦
- 安裝 MySQL ODBC Driver (MyODBC) 於 SQL Server 主機。
- 建立系統 DSN 指向 MySQL 來源。
- 在 SQL Server Enterprise Manager → DTS 導入/導出精靈,選擇來源為 ODBC DSN,目的為 SQL Server。
- 對應資料表、欄位類型,執行封裝。
- 可排程定期同步。
方法二:查詢分析器 + 匯入匯出
- 適用於小資料量、單次遷移。
- MySQL 匯出 CSV:
SELECT * INTO OUTFILE '/tmp/tbl.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' FROM tbl;
- SQL Server
BULK INSERT 或 DTS 導入 CSV。
方法三:第三方工具
- MySQL Migration Toolkit (官方免費)
- DBConvert, ESF Database Migration Toolkit 等商業工具。
應用程式改造重點
- SQL 方言差異:
- 字串串接:MySQL
CONCAT() / || (SQL_MODE=PIPES_AS_CONCAT) → SQL Server +。
- 限制筆數:MySQL
LIMIT n → SQL Server TOP n / ROW_NUMBER() OVER (2005+)。
- 自動遞增:MySQL
AUTO_INCREMENT → SQL Server IDENTITY(1,1)。
- 日期函數:
NOW() → GETDATE(),DATE_FORMAT → CONVERT/FORMAT。
- 連線字串:JDBC/ODBC/ADO.NET 驅動與連線字串全面更新。
- 交易控制:MySQL
START TRANSACTION → SQL Server BEGIN TRANSACTION。
- 大小寫敏感度:MySQL 依檔案系統/協定;SQL Server 依資料庫 Collation (預設不敏感)。
常見遷移問題與對策
| 問題 | 原因 | 解決 |
| 資料截斷 | VARCHAR 長度不足、CHAR 尾端空白 | 擴大目標欄位長度、使用 RTRIM |
| 日期溢位 | MySQL 允許 '0000-00-00'、年份 < 1753 | 清洗資料、轉為 NULL 或預設值 |
| 自動遞增衝突 | IDENTITY 插入失敗 | SET IDENTITY_INSERT tbl ON 手動插入後關閉 |
| 編碼亂碼 | MySQL utf8 vs SQL Server 預設代碼頁 | 統一用 UTF-8/Unicode,ODBC 設定正確代碼頁 |
| 外鍵建立失敗 | 父表資料不符、類型不匹配 | 先停用約束、清洗資料、再啟用 |
驗收與上線檢查清單
- [ ] 所有資料表筆數、校驗和 (CHECKSUM) 一致。
- [ ] 關鍵業務查詢結果逐筆比對。
- [ ] 預存程序/觸發器/檢視表功能測試通過。
- [ ] 應用程式整合測試 (UAT) 通過。
- [ ] 效能基準測試達標(索引、統計資訊已更新)。
- [ ] 備份/還原/高可用架構已部署驗證。
結語
遷移不僅是資料搬移,更是架構重構的契機。善用 SQL Server 的進階功能(預存程序、檢視表、索引檢視、Analysis Services),能將系統推向更高層次。建議分階段遷移、充分測試、保留回滾方案。