解決使用 UpdraftPlus 還原 WordPress 網站遇到中文亂碼的問題

使用 UpdraftPlus 外掛還原 WordPress 網站遇到中文亂碼的問題。解決方式是修改資料庫備份的文字編碼。

Made with DALL-E 3


問題狀況

我公司網站使用 WordPress.com 的「商用版方案」,內建了類似 Mac「時光機」的「Jetpack VaultPress Backup」能即時備份及指定還原時間點的網站副本。但根據公司的資安規範和備份321原則:

備分321原則:「至少備份3份;使用2種不同的備份方法(如光碟備份、外接硬碟備份、磁帶備份),其中1份要存放異地」。 (資料來源:檔案管理局)

Jetpack 的自動備份符合「至少備份3份」原則,但是全部備份都儲存在 WordPress.com,並未達到「其中1份要存放異地」原則。

外掛目錄搜尋關鍵字「backup」,可以找許多自動備份 WordPress 網站的外掛。後來決定採用「UpdraftPlus Backup/Restore」外掛主要是因為支援自動備份到微軟 OneDrive 雲端硬碟。

但是還原備份檔案卻遇到中文亂碼問題。

問題解決方式

模擬 WordPress.com 主機硬碟壞掉的狀況,改成到微軟 OneDrive 雲端硬碟下載備份檔案。

1. 下載 WordPress

2. 在自己電腦或其他網站主機商架設全新的 WordPress

3. 安裝「UpdraftPlus Backup/Restore」外掛

4. 到微軟 OneDrive 雲端硬碟下載備份檔案

從 WordPress 後台看備份的歷史記錄,可以看到完整備份包含 6 個檔案。有些時候外掛升級,就那個時間點只會有資料庫跟外掛兩個備份檔案。


5. 回到剛剛下備的備份檔目錄

6. 上圖名稱以 「-db.gz」結尾的檔案是資料庫的備份檔案,解壓縮後可以得到 WordPress 的資料庫 SQL 檔案。

7. 備份檔案內的中文是正常的,但是如果直接還原會遇到中文亂碼的問題

WordPress 儲存文章的資料表名稱是「wp_posts」,搜尋 SQL 檔案內「wp_posts」的位置,可以看到文章內容是正常的中文。

8. 問題在備份檔案指定錯誤的文字編碼 (預設字符集)

(1) 尋找: SET NAMES latin1
取代為: SET NAMES utf8

(2) 尋找: CHARSET=latin1;
取代為: CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

SET NAMES latin1 是 SQL 語法指令,用於設定資料庫連線使用 latin1 字符集。latin1 是支持歐美語言的字符編碼,不適合包含中文字的資料。這個指令造成還原後的 WordPress 中文亂碼。因此需要改為 utf8 符集。

9. 開啟支援 GZ  (gzip) 檔案格是的壓縮軟體,例如:免費軟體 7-zipKeka.app

將修改後的 SQL 檔案,壓縮為 GZ 格式 (gzip) 檔案。

記得要維持原本的檔案名稱,例如原本是 「xxx-db.gz」,而不可以是 「xxx-db.tar.gz」會造成還原錯誤。

10. 就可以使用原本 「UpdraftPlus Backup/Restore」外掛的功能,順利還原檔案。

版本資訊

  • WordPress v. 6.4.1
  • UpdraftPlus Backup/Restore v. 2.23.13.0

參考資料

  1. Jetpack 備份與還原 – 支援
  2. 國家發展委員會檔案管理局:檔案知識+-珍藏所愛,愛所珍藏-淺談防護重要檔案免受勒索軟體威脅
  3. 蕃茄腦袋: [轉載]MySQL 的「SET NAMES UTF8」字元編碼問題
  4. MySQL :: MySQL 8.0 Reference Manual :: 13.7.6.3 SET NAMES Statement

留言