網站設計: 更改 MySQL data base collate 從 latin1_swedish_ci 變 utf8_general_ci (Website Design)


我從 2002 年就跟加拿大的 Tera-byte.com 租 Web hosting, 也就是俗稱的主機代管以及網域. 這麼多年來, 最滿意的就是他們的 technical support via Email. 如果你的英文能力以及自己的基礎知識夠的話, 我真的推薦 Tera-byte. 年費很低, 而且可以申請 .com 而不是 .com.tw 的網域. 雖然主機在加拿大, 連線速度還不錯.

過去的這兩天, 因為要把平靜的流域部落格從 www.greenort.com/blog 搬到 www.greenort.com, 想順便解決一個老問題: 部落格的 MySQL data base 在後台 PhpAdmin 工具不能正確顯示中文.

這個事情的根本原因是, 當初在建立 MySQL data base 時, 使用了 Tera-byte.com (以及很多外國的 web hosting) 預設的 collate “latin1_swedish_ci”. 等到資料庫變大了, 就擔心變更的風險. 反正 web browser 可以正確顯示, 就不去管它. 現在決定要把部落格的 MySQL data base 的 collate 改成 “utf8_general_ci”, 最安全的方法是把原本的 data base 複製到另一個 utf8_general_ci 的 data base, 再把 Wordpress 的 configuration 指向到這個新的 data base.

先講不成功的方法. 在 Tera-byte.com 提供的 phpMyAdmin 工具本身就有改變 collate 以及 copy 到不同 collate 的 data base 的功能. 但是這樣做不能溯及既往, 原來 “latin1_swedish_ci” 編碼的中文內容依然是亂碼.

latin1_swedish_ci

這裡是成功的做法:

(1) 先用 phpMyAdmin 把原本 “latin1_swedish_ci” 編碼的 data base 改成 “utf8_general_ci” collate.

(2) export 這個 data base 到 文字格式的 SQL 檔案.

(3) 用 emeditor 類似的編輯器打開這個 SQL 檔案. 這時候中文當然仍然是亂碼. 不要緊,
因為我們最終要把這個 SQL 檔案用 “utf8_general_ci” 編碼儲存後再用 phpMyAdmin 工具 import 回去.

首先, 把原本的 data base 名稱與新建指令刪除

— Database: `greenort_com_dbase1`

CREATE DATABASE `greenort_com_dbase1` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `greenort_com_dbase1`;

用 emeditor 的 save as, 存成 ISO 8859 編碼. 立即關閉這個檔案.

再打開這個 ISO 8859 編碼的 SQL 檔案, 中文字已經可以正確顯示.

再 save as 一次, 這次用 utf-8 編碼儲存. 立即關閉這個檔案.

再打開這個 utf-8 編碼的 SQL 檔案, 確認中文字還是正確顯示.

這個檔案已經可以 import 了.

接下來, 準備承接這個 SQL 檔案的空白 data base.

用 Tera-byte.com 提供的 site admin 工具, 建立一個新的 MySQL data base.

用 phpMyAdmin 工具把它的 collate 改成 utf8_general_ci.

在 phpMyAdmin 執行 import. 確定選擇的是新建的 data base, SQL 檔案編碼是 utf-8. 指定剛才做好的 SQL 檔案.

哇, SQL 超過限定的 8MB!  只好寫 Email 給 Tera-byte.com 的 technical support 請他們代為 import.

Import 後, 果然原本的中文內容在新的 data base 在 phpMyAdmin 可以正確顯示了.

更改 MySQL data base collate 從 latin1_swedish_ci 變 utf8_general_ci

最後, 修改 Wordpress 的 wp-config.php 如下, 指向新的 data base

define(‘DB_NAME’, ‘greenort_com_blog_utf8’);
define(‘DB_CHARSET’, ‘utf8’);
define(‘DB_COLLATE’, ‘utf8_general_ci’);

大功告成. 原本的 data base 先保留一段時間再刪除吧!

發佈留言