| 問題 | 影響 | 原因 |
| ntext/image 類型無法直接寫入 | 資料遺失或遷移失敗 | 類型系統不兼容 |
| 時間戳欄位類型衝突 | INT vs DATETIME 映射錯誤 | 目標表設計為 INT 存儲 Unix 時間戳 |
| 自動生成欄位類型不合理 | 需大量人工修正 DDL | 類型映射規則固化 |
結論: 僅適合結構簡單、類型基礎、一次性小規模遷移。
方案二: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 超長文本 | 改為 nvarchar(4000),實測實際長度未超限,無截斷風險 |
| image 二進制檔案 | 寫入檔案系統,資料庫只存路徑(見下方 makeattach 函數) |
二進制檔案落地函數(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
遷移最佳實踐總結
- 先結構後資料: 手工建立目標表結構,確保類型精確匹配
- 分表遷移驗證: 逐表遷移,每表完成後抽樣對比行數、關鍵欄位
- 保留原始資料: 遷移前完整備份,建立回滾方案
- 時間統一用 Unix 時間戳: 跨平台無時區歧義,運算高效
- 大物件檔案化: BLOB/TEXT 超大欄位建議落地存儲,資料庫存引用
- 上一篇文章: MySQL 文字、日期與集合類型深度解析:TEXT、DATE、SET
- 下一篇文章: MySQL ODBC 驅動實現 SQL Server 7 與 MySQL 雙向資料轉換
Copyright ©
程式碼之家 All Rights Reserved