ASP/MSSQL → PHP/MySQL 架構遷移,核心挑戰是數據遷移。常見方案對比:
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| myODBC 直連 | 直觀、圖形化 | 驅動版本地獄、MSSQL 2005+ 常失敗 | 小數據量、環境單純 |
| MSSQL→Access→MySQL | 中轉通用 | 雙重轉換易亂碼、Access 2GB 限制 | 中小數據、臨時遷移 |
| 自寫程序 (PHP/Python) | 完全可控 | 開發耗時、效能受限於單線程 | 複雜轉換邏輯、增量同步 |
| CSV + LOAD DATA | MySQL 原生、高效、並行可控 | 需處理編碼、分隔符、大文件上傳 | 大數據量、生產遷移首選 |
-- MSSQL 生成腳本:右鍵資料庫 → 任務 → 生成腳本
-- 批量替換規則(使用 UE/EditPlus/VS Code 正則):
-- 類型映射:NVARCHAR→VARCHAR, DATETIME→DATETIME, INT→INT, BIT→TINYINT(1)
-- 移除:方括號 [], COLLATE 子句, IDENTITY(1,1)→AUTO_INCREMENT
-- 統一字符集:CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
-- 引擎:ENGINE=InnoDB
-- 推薦使用 phpMyAdmin 或 mysql 命令列
mysql -uroot -p db_name < create_tables.sql
-- 或分批執行,觀察報錯調整
LOAD DATA 預期 UTF-8iconv -f UTF-16LE -t UTF-8 input.csv > output.csv,"LOAD DATA INFILE '/path/to/table.csv'
INTO TABLE `table_name`
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 0 LINES;
; php.ini
upload_max_filesize = 500M
post_max_size = 500M
memory_limit = 1024M
max_execution_time = 3600
max_input_time = 3600
或直接用命令列 LOAD DATA INFILE 繞過 PHP。
utf8mb4charset=utf8mb4| MSSQL | MySQL 建議 | 注意 |
|---|---|---|
| NVARCHAR(N) | VARCHAR(N*2) 或 TEXT | Unicode 佔 2 字節 |
| DATETIME | DATETIME(3) | 精度毫秒級 |
| BIT | TINYINT(1) | MySQL 無 BIT 邏輯類型 |
| MONEY | DECIMAL(19,4) | 精確貨幣計算 |
| UNIQUEIDENTIFIER | CHAR(36) | UUID 字串存儲 |
-- 導入前暫時關閉
SET FOREIGN_KEY_CHECKS=0;
SET UNIQUE_CHECKS=0;
SET AUTOCOMMIT=0;
-- 導入後重新開啟並驗證
SET FOREIGN_KEY_CHECKS=1;
SET UNIQUE_CHECKS=1;
COMMIT;
SELECT COUNT(*) FROM src_table vs SELECT COUNT(*) FROM dst_tableCSV + LOAD DATA 是 MySQL 原生、最高效的批量導入路徑。掌握編碼控制、類型映射、大文件處理三大核心,百萬級甚至億級表遷移也能從容應對。