首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 遷移 MySQL 實戰經驗:兩種方案深度對比

     編輯:MySQL 資料庫相關知識

從 SQL Server 遷移到 MySQL:方案選型與實戰避坑指南

專案需將 SQL Server 資料完整遷移至 MySQL。經調研與實測,對比兩種主流方案優劣,總結適用場景與關鍵避坑技巧。

方案一:MySQL ODBC + SQL Server 導出精靈(不推薦生產環境)

操作流程

  1. 安裝 MySQL ODBC 驅動
  2. 配置系統 DSN 指向目標 MySQL
  3. SQL Server 管理工具 → 導出資料 → 選擇 MySQL DSN

核心缺陷

結論: 僅適合結構簡單、類型基礎、一次性小規模遷移。

方案二:PHP/ASP 腳本程式化遷移(推薦生產環境)

核心優勢

  • 完全可控: 類型轉換、資料清洗、錯誤處理皆可自定義
  • 支援複雜邏輯: 條件篩選、增量同步、斷點續傳
  • 解決類型難題: 針對 ntext/image、時間戳等問題精準處理

PHP 遷移腳本核心邏輯

<?php
// 1. 建立雙向連接
$mssql = odbc_connect('web', 'admin', '123456');  // SQL Server DSN
$mysql = mysql_pconnect('localhost', 'root', '123456');
mysql_select_db('mydb', $mysql);

// 2. 逐行讀取並轉換
while (odbc_fetch_row($mssql_result)) {
    $field1 = odbc_result($mssql_result, 1);
    // ... 取得各欄位
    
    // 關鍵:datetime → Unix 時間戳
    $field5 = timetoint($field5);  
    
    // 3. 寫入 MySQL
    $sql = "INSERT INTO user (id,name,username,password,recdate) 
            VALUES ('$field1','$field2','$field3','$field4','$field5')";
    mysql_query($sql, $mysql);
}

// 4. 時間轉換函數
function timetoint($str) {
    list($date, $time) = explode(' ', $str);
    list($y, $m, $d) = explode('-', $date);
    list($h, $i, $s) = explode(':', $time);
    return mktime($h, $i, $s, $m, $d, $y);
}
?>

ASP 遷移關鍵技巧:SQL 端直接轉換

sql = "SELECT ID, name, username, password, 
       DATEDIFF(s, '1970-01-01 00:00:00', recdate) - 8*3600 AS recdate_ts
       FROM senddate"
' SQL Server 端直接計算 Unix 時間戳(扣除時區偏移)

疑難雜症專項解決方案

問題影響原因
ntext/image 類型無法直接寫入資料遺失或遷移失敗類型系統不兼容
時間戳欄位類型衝突INT vs DATETIME 映射錯誤目標表設計為 INT 存儲 Unix 時間戳
自動生成欄位類型不合理需大量人工修正 DDL類型映射規則固化

二進制檔案落地函數(ASP/VBScript)

Function makeattach(fileContentType, filevalue, i)
    ' 根據 MIME 類型決定副檔名
    Select Case fileContentType
        Case "application/msword": ext = "doc"
        Case "application/vnd.ms-excel": ext = "xls"
        Case "image/jpeg": ext = "jpg"
        ' ... 更多類型映射
    End Select
    
    If ext <> "x" Then
        Set fso = Server.CreateObject("Scripting.FileSystemObject")
        fName = "attach" & i & "." & ext
        Dir = "D:\attach\"
        ' 寫入二進制流
        Set strm = Server.CreateObject("ADODB.Stream")
        strm.Type = 1 ' adTypeBinary
        strm.Open
        strm.Write filevalue
        strm.SaveToFile Dir & fName, 2
        strm.Close
        makeattach = fName  ' 返回檔名存入資料庫
    End If
End Function

遷移最佳實踐總結

  1. 先結構後資料: 手工建立目標表結構,確保類型精確匹配
  2. 分表遷移驗證: 逐表遷移,每表完成後抽樣對比行數、關鍵欄位
  3. 保留原始資料: 遷移前完整備份,建立回滾方案
  4. 時間統一用 Unix 時間戳: 跨平台無時區歧義,運算高效
  5. 大物件檔案化: BLOB/TEXT 超大欄位建議落地存儲,資料庫存引用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題解決方案
ntext 超長文本改為 nvarchar(4000),實測實際長度未超限,無截斷風險
image 二進制檔案寫入檔案系統,資料庫只存路徑(見下方 makeattach 函數)