網頁

2005年11月9日 星期三

MySQL 升級,phpBB UTF8 化

恩,非常悲苦。為了在 RW 跑個 portupgrade -acCv 受盡苦難。首先我要說,在 FreeBSD 下還是保險起見不要用 -O3 ,代價太大了。這幾天 RW 重編 Apache2 的次數我想不下二十次!到最後發現竟然是 make.conf 裡的 -O3 在搗蛋。而且因為同時炸太多東西了,所以根本很難發現誓死那個。首先, Perl 掰了,然後 trac 的 Python ,然後 php .. 這個教訓告訴我們不要手賤,等等想到再來把 FastCGI 給裝回去吧 -_-。

爆炸最大的大概是 MySQL ,不知道什麼年代開始,RW 的 MySQL 就變成沒有人敢動的版本,永遠都停在 4.0.20 ...某次不小心升級之後所有 database 全爛,也沒有人有空去看 why ,於是偉大的 clode 就不知道去那弄了 4.0.20 的 package 來,反正誰不小心幹掉就直接用 package 硬裝。(很勇敢對吧?)。很不巧,這次又是我手賤,執意要把 MySQL 換上去,並且還想「順便」把裡面的 database 「全面」 UTF8 化,所以代價就是好幾天幾乎都沒睡超過四小時。不過好在,最後似乎轉過去了。雖然中間應該多少損失一些資料。首先,在 MySQL 4.0.20 的時候先把資料給 dump 出來:

mysqldump -uroot rwphpbb > rwphpbb.sql

我 看到很多人說在 dump 的時候要記得設 -default-char-set=latin1 ,我之前也確實必須要這樣設定才能 dump 出正確的檔案,不過不知道是因為之前編的關係還是版本問題,加了之後反而沒辦法 dump ,所以...。然後就把 MySQL 升級,不過因為是用 portupgrade ,他升到了 4.x ,於是我手動幹掉裝成 MySQL 5 (反正要痛苦就一次痛苦個夠,反正這次我做了很充分的備份),不過健忘症發作,忘了下 -default-charset=utf8 ,所以變成在 rc.conf 裡面加上:

mysql_enable="YES"
mysql_args="--default-character-set=utf8"

然後中間經歷了很多 Apache/PHP 的爆炸就略過不提。處理完之後便拿 RW 的 phpBB 來開刀,首先照著我之前那篇 wordpress 的方式把 .sql 檔案轉換好:

*add follow line to .sql file

SET NAMES utf8;
SET CHARACTER_SET_CLIENT=utf8;
SET CHARACTER_SET_RESULTS=utf8;

*use vim to replace charset

(:1,xxxs/latin1/utf8/g)
這裡我是把 big5e 都換成 utf8 ,雖然我不確定對不對...

*use iconv/piconv 轉換 database big5->utf8

piconv -f big5 -t utf8 rwphpbb_utf8.sql > aaa.sql

然後把他匯入 MySQL,在啟動 MySQL 之前先確定剛剛的 rc.conf 已經設定好,這樣才會把預設的 table 蓋成 UTF8 而不用指定,另外就是 my.cnf 的設定,我暫時是
cp /usr/local/share/mysql/my-medium.cnf /var/db/mysql/my.cnf 然後在 [mysqld] 的 section 加上 init_connect = 'SET NAMES UTF8;' (反正都要全面 UTF8 化了),然後蓋 database 、匯入、設定使用者(因為我是把整個資料庫砍掉重鍊)。

*create database

mysqladmin -uroot create rwphpbb

*restore database

mysql -f -u root rwphpbb < aaa.sql
(用-f 是因為我遇到很多錯誤導致做到一半就爛了,所以強制做完,至於錯誤是啥我也不知道 -_-)

*create database user

mysql> GRANT ALL PRIVILEGES ON 資料庫名稱.* to 使用者名稱@localhost IDENTIFIED BY '密碼';

然後接下來處理 phpBB。如果你看到:

phpBB : Critical Error

Could not connect to the database

請 到 config.php 裡面把 $dbms = 'mysql'; 換成 $dbms = 'mysql4'; 然後燒香拜拜看看連不連的上。連上的話沒有意外你會發現一狗票亂碼,不要擔心,這是正常的。我爬了一些文章後發現 phpBB 官方(或者說是台灣語系的站台)並沒有釋出 UTF8 版本的 Language Pack ,所以很不幸的得自己做。不過不難。只是把中文語系那個目錄的 lang_main.php 裡的 $lang['ENCODING'] = 'big5'; 換成 $lang['ENCODING'] = 'UTF-8'; ,然後把 email 目錄裡的所有檔案的第二行 Charset: Big5 換成 Charset: UTF-8就好了。可以參考 這裡 。或是懶得搞的話可以抓我轉好的 phpBB2.0.17 UTF8 中文語系包。 要注意解開前先把你的 lang_chinese_traditional_taiwan 目錄 rename 一下,本來我是想弄個類似 lang_chinese_traditional_taiwan-UTF8 的語系,可是後來發現這樣會爆炸很大,所以只好用原來的 lang_chinese_traditional_taiwan ,所以你可能需要把 lang_chinese_traditional_taiwan rename 成 lang_chinese_traditional_taiwan.big5 之類的。理論上沒意外的話進去應該會看到 UTF8 的畫面了,感動吧!你可能會注意到好像主畫面是 Big5/UTF8 混合,很神奇吧 -_-。找半天不知道是啥原因,想說應該是 cache ,於是把 phpBB2 裡面的 cache/cache2 都幹掉了還是一樣...到最後才發現,原來去新蓋一個討論板他就會清掉了,那不然他不是存在 cache 裡面是存在那啊 -_-?。

剩下的,就等其他人(使用者)遇到問題再說吧,我跟 phpBB 超不熟,連用都沒在用 :~ 。