utf8,前端頁面為 gb2312,連線未執行 SET NAMES。INSERT SQL 腳本,儲存為 UTF-8 編碼檔案。rescue.php<?php
$link = mysqli_connect('localhost', 'root', 'root', 'temp');
mysqli_set_charset($link, 'utf8'); // 關鍵:以 UTF-8 讀取
$table = 'article';
$res = mysqli_query($link, "SELECT * FROM `$table`");
$sql_lines = [];
while ($row = mysqli_fetch_assoc($res)) {
$cols = array_keys($row);
$vals = array_map(function($v) use ($link) {
return "'" . mysqli_real_escape_string($link, $v) . "'";
}, $row);
$sql_lines[] = "INSERT INTO `$table` (" . implode(',', $cols) . ") VALUES (" . implode(',', $vals) . ");";
}
file_put_contents("sql/{$table}_rescue.sql", implode("\n", $sql_lines));
echo "Generated: sql/{$table}_rescue.sql\n";
mysqli_free_result($res);
mysqli_close($link);
?>
.sql 檔。-- 1. 建立新資料庫/表(正確字元集)
CREATE DATABASE rescued DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE rescued;
CREATE TABLE article LIKE temp.article; -- 複製結構
ALTER TABLE article CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 2. 匯入救援 SQL
-- 方式 A:phpMyAdmin 介面匯入(小檔案)
-- 方式 B:命令列(大檔案、穩定)
mysql -u root -p rescued < sql/article_rescue.sql
RENAME TABLE temp.article TO temp.article_bak;,新表遷移至正式庫。SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;,匯入後恢復並 COMMIT。LOAD DATA INFILE 替代 INSERT(需 CSV 格式)。救援完成後,務必在應用程式連線初始化加入:
mysqli_set_charset($link, 'utf8mb4');
// 或 PDO
$pdo = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', 'user', 'pass');
並將資料庫/表/欄位全面轉為 utf8mb4,徹底杜絕亂碼復發。