虛擬主機環境下,phpMyAdmin 匯入大型 SQL 檔常因執行時間、記憶體、上傳大小限制而失敗。採用 PHP 分批處理文字檔方式可繞過限制。
<?php
$table = 'your_table_name';
$tname = mysql_query("SELECT * FROM `$table`");
if (mysql_num_rows($tname) <= 0) exit('Table is empty');
$handle = fopen("$table.txt", 'w');
$n_s = mysql_num_fields($tname);
fputs($handle, "$n_s "); // 寫入欄位數
for ($start = 0; $row = mysql_fetch_row($tname); $start++) {
for ($i = 0; $i < $n_s; $i++) {
// 特殊字元編碼:空白、Tab 替換為標記
$row[$i] = str_replace(' ', '&&jimmy&&', $row[$i]);
$row[$i] = str_replace("\t", '&&jimmy&&', $row[$i]);
fputs($handle, $row[$i] . ' ');
}
fputs($handle, "------- PHP2000 dump data program V1.0 for MySQL -------- ");
}
fclose($handle);
echo "ostart";
?>
<?php
$table = 'your_table_name';
$rate_info = file("$table.txt");
$n_s = (int)trim($rate_info[0]); // 讀取欄位數
for ($start = 1; $start < count($rate_info); $start += $n_s) {
$value = '';
for ($i = $start; $i < $start + $n_s - 1; $i++) {
$tmp = str_replace('&&jimmy&&', ' ', trim($rate_info[$i]));
$value .= "'" . addslashes($tmp) . "',";
}
$tmp = str_replace('&&jimmy&&', ' ', trim($rate_info[$start + $n_s - 1]));
$value .= "'$tmp'";
$query = "INSERT INTO `$table` VALUES ($value)";
mysql_query($query);
echo mysql_error() . " $start ";
}
echo "ostart";
?>
&&jimmy&&,避免欄位分隔混淆addslashes() 轉義mysqli 或 PDO 預處理語句BEGIN; ... COMMIT; 確保一致性NULL 值處理(目前空字串與 NULL 不區分)gzencode())節省空間CHECKSUM TABLE 比對| 方案 | 優點 | 缺點 |
|---|---|---|
| mysqldump + source | 官方工具、功能完整 | 大檔案易超時、記憶體峰值高 |
| PHP 分批文字檔 | 繞過限制、可控流程 | 需自行維護、效能較慢 |
| SELECT ... INTO OUTFILE / LOAD DATA | 極快、原生支援 | 需檔案系統權限、虛擬主機常禁用 |