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

MySQL 亂碼資料救援實戰:匯出→轉碼→重新匯入完整操作流程

     編輯:MySQL 資料庫相關知識

現象診斷

  • phpMyAdmin 顯示亂碼,但前端頁面正常顯示。
  • 資料庫/表/欄位字元集為 utf8,前端頁面為 gb2312,連線未執行 SET NAMES。
  • 實際資料以 Latin1 (ISO-8859-1) 錯誤儲存了 UTF-8 位元組(雙重編碼或連線編碼錯配)。

救援核心邏輯

  1. 以正確連線編碼讀出資料(此時應用層顯示正常)。
  2. 產生 INSERT SQL 腳本,儲存為 UTF-8 編碼檔案。
  3. 建立新表(正確字元集),匯入 SQL 腳本。

PHP 救援腳本 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);
?>

關鍵步驟:檔案編碼轉換

  1. 用編輯器(Notepad++, VS Code, EditPlus)開啟產出的 .sql 檔。
  2. 另存新檔 → 編碼選 UTF-8(無 BOM)。
  3. 確認檔案內容中文正常顯示,無亂碼。

建立新表並匯入

-- 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

驗證與替換

  1. phpMyAdmin 檢視新表資料 → 中文正常。
  2. 前端頁面測試 → 正常顯示。
  3. 確認無誤後,重命名舊表 RENAME TABLE temp.article TO temp.article_bak;,新表遷移至正式庫。

大資料量優化

  • 分批次匯出/匯入(每 1 萬筆一檔)。
  • 匯入前 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,徹底杜絕亂碼復發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved