本方案採用 PHP 腳本,透過 COM 組件讀取 Access (.mdb),逐筆寫入 MySQL,解決編碼與欄位型別對應問題。
<?php
$dbhost = "localhost:3307";
$dbname = "dataname";
$dbuser = "root";
$dbpass = "*******";
$table_pre = "sdb_";
$link = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
if (!$link) die("連線失敗: " . mysqli_connect_error());
mysqli_set_charset($link, "utf8mb4");
?>
註:原碼使用已棄用的 mysql_* 函數,此處升級為 mysqli 並採用 utf8mb4。
<?php
$mdb_path = realpath("data.mdb");
$conn_str = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$mdb_path";
$conn = new COM("ADODB.Connection");
$conn->Open($conn_str);
$rs = new COM("ADODB.RecordSet");
$rs->Open("SELECT * FROM information WHERE lanmu3id = 13", $conn, 1, 1);
?>
<?php
while (!$rs->EOF) {
// 編碼轉換:Access 通常為 GB2312/Big5,MySQL 存 UTF-8
$id = iconv('gb2312', 'utf-8', $rs->Fields('ID')->value);
$title = iconv('gb2312', 'utf-8', $rs->Fields('title')->value);
$summary = iconv('gb2312', 'utf-8', $rs->Fields(1)->value);
$content = iconv('gb2312', 'utf-8', $rs->Fields('content')->value);
$download= iconv('gb2312', 'utf-8', $rs->Fields('download')->value);
echo "<font color=red>$title</font> 已匯入<br>";
$sql = "INSERT INTO `shopex`.`{$table_pre}articles`
(`article_id`,`node_id`,`title`,`content`,`uptime`,`ifpub`,`align`,`filetype`,`filename`,`orderlist`,`disabled`)
VALUES (NULL, '{$fenlei}', '$title', '$content', UNIX_TIMESTAMP(), 1, NULL, NULL, NULL, NULL, 'false')";
mysqli_query($link, $sql) or die("寫入失敗: " . mysqli_error($link));
$rs->MoveNext();
}
?>
iconv 轉 UTF-8,否則中文亂碼。INSERT 或改用 LOAD DATA INFILE,效能提升數十倍。