資料庫異構遷移是常見需求。本文示範使用 PHP 同步連接 MSSQL 與 MySQL,將資料從 SQL Server 遷移至 MySQL 的完整流程,包含環境設定、資料型別對應、批次處理與錯誤處理。
<?php
// 設定參數
$mssqlDsn = "sqlsrv:Server=127.0.0.1;Database=hb";
$mssqlUser = 'sa';
$mssqlPass = '1';
$mysqlDsn = "mysql:host=localhost;dbname=sa;charset=utf8mb4";
$mysqlUser = 'root';
$mysqlPass = 'a';
try {
// 建立雙連線
$mssql = new PDO($mssqlDsn, $mssqlUser, $mssqlPass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$mysql = new PDO($mysqlDsn, $mysqlUser, $mysqlPass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
]);
// 開始交易 (MySQL 端)
$mysql->beginTransaction();
// 1. 從 MSSQL 讀取資料
$stmt = $mssql->query("SELECT id, title FROM bc");
$batchSize = 100;
$batch = [];
$total = 0;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$batch[] = $row;
// 批次寫入 MySQL
if (count($batch) >= $batchSize) {
insertBatch($mysql, $batch);
$total += count($batch);
$batch = [];
echo "已遷移 $total 筆...<br>";
if (php_sapi_name() !== 'cli') flush(); // Web 環境即時輸出
}
}
// 處理剩餘資料
if (!empty($batch)) {
insertBatch($mysql, $batch);
$total += count($batch);
}
$mysql->commit();
echo "<br>遷移完成!共 $total 筆資料。";
} catch (PDOException $e) {
if (isset($mysql)) $mysql->rollBack();
die("遷移失敗:" . $e->getMessage());
}
// 批次插入函式
function insertBatch(PDO $pdo, array $rows) {
if (empty($rows)) return;
$placeholders = implode(',', array_fill(0, count($rows), '(?, ?)'));
$sql = "INSERT INTO vv (id, title) VALUES $placeholders";
$stmt = $pdo->prepare($sql);
$params = [];
foreach ($rows as $row) {
$params[] = $row['id'];
$params[] = $row['title'];
}
$stmt->execute($params);
}
?>
單筆 INSERT 效能極差。使用多值 INSERT 或 LOAD DATA INFILE 可提升 10-100 倍速度。
| MSSQL | MySQL | 注意事項 |
|---|---|---|
| int / bigint | INT / BIGINT | 自動遞增用 AUTO_INCREMENT |
| varchar / nvarchar | VARCHAR / TEXT | nvarchar 需確保 UTF-8 編碼 |
| datetime / datetime2 | DATETIME / TIMESTAMP | 時區處理需一致 |
| decimal / money | DECIMAL | 精度與小數位需對應 |
| bit | TINYINT(1) / BOOLEAN | MySQL 無 BOOLEAN 型別 |
| image / varbinary | BLOB / LONGBLOB | 大物件需分塊處理 |
nvarchar 儲存 Unicodecharset=utf8mb4對於生產環境大規模遷移,建議使用專業工具:
PHP 雙連線遷移適合中小型資料量、需自訂轉換邏輯的場景。核心在於:批次處理、交易控制、型別對應、編碼一致。大型遷移專案請評估專業 ETL 工具與雲端遷移服務。